O(∩_∩)O
希尔排序
优点:时间复杂度为nlog₂n 先对于插入排序而言
能够较为快速的排序数组。
81 void shell_sort(int arr[],int n){
82 int step,i,j;
83 for(step = n/2;step>0;step=step/2){
84 for(i=step;i<n;i++){
85 int key=arr[i];
86 for(j = i-step;j>=0&&key<arr[j];j = j-step){
87 arr[j+step] = arr[j];
88 }
89 arr[j+step] = key;
90 }
91 }
92 }
int arr[10]={1,99,72,444,351,624,151,4125,9,60};
升序排序
step=5,
i=5 j=0
i=6,j=1
i=7,j=2
i=8,j=3
i=9,j=4
key=arr[i],如果,key<arr[j],先进行拷贝
1,99,72,9,60,624,151,4125,444,351
step=2,
i=2,j=0
i=3,j=1
i=4,j=2, 0
i=5,j=3,1
i=6,j=4,2,0
i=7,j=5,3,1
i=8,j=6,4,2,0
i=9,j=7,5,3,1
同理,key<arr[j],进行拷贝,找到不大于key的差距为step的下标把值赋为key。
以上的j只是最坏结果有时不满足条件会直接退出
1,9,60,99,72,351,151,624,444,4125
step=1
i=1,j=0,
i=2,j=1,0
i=3,j=2,1,0
i=4,j=3,2,1,0
i=5,j=4,3,2,1,0
i=6,j=5,4,3,2,1,0
i=7,j=6,5,4,3,2,1,0
i=8,j=7,6,5,4,3,2,1,0
i=9.j=8,7,6,5,4,3,2,1,0
同理,key<arr[j],进行拷贝,找到不大于key的差距为step的下标把值赋为key。
以上的j只是最坏结果有时不满足条件会直接退出
1,9,60,72,99,151,351,444,624,4125
大家自己能够再推一遍,我觉得这种排序还是比较有用的,能够减少数组排序时间,如果大家有刷过PAT就知道了