Shell排序
Shell排序是大量数据需要排序时,更为高效的插入排序。它的算法思想基于插入排序的算法思想
流程:
(1)将n个元素数组分成n/2个数字序列,第一个数据和第n/2个数据为一对,等等,以此类推
(2)一次循环使每一个数对排列好顺序
(3)变成n/4个数对,再次排序。
(4)不断重复上述过程,随着序列减少直至最后变为1个,完成排序。
具体如何怎么排的可以运行代码查看每一步排序。
1 #include<iostream> 2 #include<cstdlib> 3 #include<ctime> 4 using namespace std; 5 void ShellSort(int *a,int len) 6 { 7 int x,t,j; 8 for (int r = len/2; r >=1 ; r/=2) //外层循环分组 9 { 10 for (int i = r; i < len; i++) 11 {//内层循环设置一定间距r,分别比较对应元素,当r=1时,这个时候就为插入排序,数组元素数量大时这时效率比插入排序高。 12 t=a[i]; 13 j=i-r; 14 while (j>=0&&t<a[j]) 15 { 16 a[j+r]=a[j]; 17 j-=r; 18 } 19 a[j+r]=t; 20 x++; 21 cout<<"Sort result after "<<x<<" step"; //输出每一步排序结果 22 for (int k = 0; k < len; k++) cout<<a[k]<<" "; 23 cout<<endl; 24 } 25 26 } 27 28 } 29 int main() 30 { 31 srand(time(NULL)); 32 int n; 33 cout<<"Please cin the size of array:"<<endl; //输入数组的大小 34 cin>>n; 35 int a[n]; 36 cout<<"Array before sorting:"<<endl; 37 for (int i = 0; i < n; i++) //利用随机数作为数组输入 38 { 39 a[i]=rand()/1000; 40 cout<<a[i]<<" "; 41 } 42 cout<<endl; 43 ShellSort(a,n); 44 cout<<"Array after sorting:"<<endl; //输出排序后的数组 45 for (int i = 0; i < n; i++) cout<<a[i]<<" "; 46 cout<<endl; 47 return 0; 48 49 }