希尔排序:
给定一个int数组A以及大小n,请返回排序后的数组;
核心思想:
1、先选择步长i,这里的步长是动态的,每次为之前步长的一半,还有一种方法是设置步长数组,但数组中步长为小于20的素数;
2、每次更新步长后,都要从步长大小的索引j=i开始,从索引j开始直到结束,进行遍历,并记录当前值为temp。
2.1每次temp都要与k=j-i的索引对应的值(也就是索引j的前面长度为步长的位置的值)进行比较;
2.2如果temp(后)<A[k](前),说明大数在前面,要让他换到后面,换到K+长度i的位置A[k+i]=A[k](因为k+i的位置的值被temp记录了,不会丢失)
2.3循环2.3,让K向左走步长个单位,进行填补,将大于temp的全部挪到后面去(每个间隔为步长i)。当temp(后)>=A[k](前)时,说明找到了temp的合适位置A[k],因为程序中多减了一次,所以是A[k+i]=temp;(重点理解)
代码:
class ShellSort {
public:
int* shellSort(int* A, int n) {
for(int i=n/2; i>=1; i=i/2){
for(int j=i; j<n; j++){
int tmp = A[j];
for(int k=j-i; k>=0 && tmp<A[k]; k=k-i){ //插入排序,向左插入,每次递减一个步长,并且比较大小
A[k+i] = A[k];
}
A[k+i] = tmp; //合适位置,因为多执行了一次k-i,所以是合适位置是K+i
}
}
return A;
}
};
main调用:
#include <iostream>
using namespace std;
int main(){
int AAA[]={1,3,6,9,2,5,4,8,7};
ShellSort S;
int *b=S.shellSort(AAA,9);
for(int i=0;i<9;i++){
cout<<b[i]<<endl;
}
return 0;
}