直接插入排序
排序思想:假设第i个记录前面的顺序表有序,将待排记录插入到合适位置,并将之后的记录后移。
void InsertSort(Sqlist &L){
for(int i=2;i<=L.length;i++){
if(LT(L.r[i],L.r[i-1]){
L.r[0]=L.r[i];
for(j=i-1;LT(L.r[0],L.r[j]);j--){
L.r[j]=L.r[j-1];
}
L.r[j]=L.r[0];
}
}
Java实现:
private void insertSort(int[] array) {
int len=array.length;
for (int i = 0; i < len-1; i++) {
for (int j = i + 1; j >0; j--) {
if (array[j] < array[j - 1]) {
int tmp = array[j - 1];
array[j - 1] = array[j];
array[j] = tmp;
}
}
}
println(array);
}
希尔排序
排序思想:先将整个待排记录序列分割成为若干个子序列分别进行直接插入排序,待整个序列“基本有序”再对全体进行一次直接插入排序。
void ShellInsert(Sqlist &L,int k){
for(int i=k+1;i<=L.length;i++){
if(LT(L.r[i],L.r[i-1]){
L.r[0]=L.r[i];
for(j=i-k;LT(L.r[0],L.r[j]);j-=k){
L.r[j]=L.r[j-1];
}
L.r[j]=L.r[0];
}
}
void ShellSort(Sqlist &L,int dlta[],int t){
for(int k=0;k<t;k++){
ShellSort(L,dlta[k]);
}//for
}
Java实现:
private int dlta[] = {4,3,2,1};
private void shellSort(int[] array){
int dl=dlta.length;
for (int i = 0; i < dl; i++) {
shellInner(array,dlta[i]);
println(array);
}
println(array);
}
private void shellInner(int[] array,int step){
int len=array.length;
for (int i = 0; i < len-step; i += step) {
for (int j = i + step; j > 0; j -= step) {
if (array[j] < array[j - step]) {
int tmp=array[j];
array[j]=array[j-step];
array[j-step]=tmp;
}
}
}
}