题目要求:对1 ~n的n个整数进行排序,要求时间复杂度O(n)

37 阅读1分钟
// O(n): 只能单循环

// 分析
// 1.将1 - n这些数存入到数组中(肯定有数组)
// 2. 1 - n这n个数不能有重复, 也不能出现负数(不能出现负数,是因为从1开始)
// 3.当前的元素和下标值差1(a [i] 这个元素应该放在a[i] - 1这个下标的位置)

#include <stdio.h>
void cyclicSort(int arr[], int len)
{
  for (int i = 0; i < len; i++) // 遍历数组,i 是当前检查的位置。
  {
    while (arr[i] != i + 1) // 如果 arr[i] 不是 i + 1(即不在正确位置),就进入循环
     // 为什么用 while 而不是 if? 因为交换后,新换到 arr[i] 的数字可能仍然不在正确位置,所以要继续交换,直到 arr[i] 归位。
      {
        int cor = arr[i] - 1; // 计算正确的位置 cor是正确位置的下标

        //  进行交换
        int temp = arr[i];
        arr[i] = arr[cor];
        arr[cor] = temp;
      }
  }
}

int main()
{
  int arr[] = {3, 1, 4, 2, 5};          // 待排序数组(1~5 的排列)
  int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度

  cyclicSort(arr, n); // 调用排序函数

  printf("Sorted array: ");
  for (int i = 0; i < n; i++)
  {
    printf("%d ", arr[i]); // 打印排序后的数组
  }

  return 0;
}