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 }
运行结果如下: