// 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;
}