一种特殊情况下 o(n) 复杂度的排序

1,2,……,n这n个数,无序地保存在数组c[1..n]中,请编写一个时间复杂度为O(n)的排序算法,将数组c[1..n]按小到大排序。

------------------------

思路: 由于这个数组很特殊,1到n个数,一一乱序保存在1,到n的数组中

只需要对其遍历将a[i] 与 a[a[i]] 进行交换,知道 a[i] = i

实现代码如下

 1 #include <stdio.h>
 2 
 3 void sort(int a[], int n)
 4 {
 5     int t, i;
 6     for(i = 1; i <= n; i++)
 7     {
 8         while(a[i] != i)  //a[i] 与 a[a[i]] 交换, 用t 来代替 a[i]
 9         {
10             t = a[i];
11             a[i] = a[t];
12             a[t] = t;
13         }
14     }
15 }
16 
17 void print(int a[], int n)
18 {
19     int i;
20     for(i = 1; i <= n; i++)
21     {
22         printf("%d ", a[i]);
23     }
24     printf("
");
25 }
26 
27 int main()
28 {
29     int a[11] = {0, 10, 8, 9, 7, 4, 1, 2, 3, 5, 6};
30     print(a, 10);
31     sort(a, 10);
32     print(a, 10);
33 }

运行结果如下:

原文地址:https://www.cnblogs.com/hello-lijj/p/7158968.html