C++编程 希尔排序
步骤:
1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重复上述操作…
2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
动图如下:
#include<iostream>
using namespace std;
int x[10]={44,534,6,53,96,7,56,8,76,3};void shuchu(){for(int i=0;i<10;i++){cout<<x[i]<<" ";}cout<<endl;
}//插入排序
void b(int gap) {//对 间隔维gap的子数组进行 插入排序,如果gap==1 即是最纯的插入排序 for(int i=0;i<10;i++){ int end=i;int temp=x[end]; while(end-gap>=0){if(x[end-gap]>temp){x[end]=x[end-gap];end-=gap;}else break;}x[end]=temp;}
}
//希尔排序
void a(int n){int gap=n/2;while(1){ b(gap);if(gap==1)return;else gap/=2;}
}int main()
{shuchu();//b(1);//如果gap==1 即是最纯的插入排序 a(10);shuchu();
}
参考代码:六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序-CSDN博客
//希尔排序
void ShellSort(int* arr, int n)
{int gap = n;while (gap>1){//每次对gap折半操作gap = gap / 2;//单趟排序for (int i = 0; i < n - gap; ++i){int end = i;int tem = arr[end + gap];while (end >= 0){if (tem < arr[end]){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tem;}}
}