有N个大小不等的自然数(1,2,3,…..N)请将它们从小到大排列。算法要求:时间复杂度为O(n),空间复杂度为O(1)。请简要说明你采用的排序算法并写出c的伪代码。
1 // 计数排序.cpp : 定义控制台应用程序的入口点。 2 //有N个大小不等的自然数(1,2,3,…..N)请将它们从小到大排列。算法要求:时间复杂度为O(n),空间复杂度为O(1) 3 4 #include "stdafx.h" 5 #include <stdio.h> 6 7 void counting_sort(int A[],int N) 8 { 9 int C[100],i,j; 10 int B[100]; 11 for(i=1;i<=N;i++) 12 C[i]=0; 13 for(j=0;j<N;j++) 14 C[A[j]]+=1; 15 for(i=2;i<=N;i++) 16 C[i]=C[i-1]+C[i]; 17 for (j=N-1;j>=0;j--) 18 { 19 B[C[A[j]]]=A[j]; 20 C[A[j]]-=1; 21 } 22 for(int k=0;k<N;k++) 23 A[k]=B[k+1]; 24 } 25 26 void main() 27 { 28 int a[]={5,3,6,1,4,2,7}; 29 int n=sizeof(a)/sizeof(a[0]); 30 for(int k=0;k<n;k++) 31 printf("%2d",a[k]); 32 printf("\n"); 33 counting_sort(a,n); 34 for(int k=0;k<n;k++) 35 printf("%2d",a[k]); 36 }