希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量(gap)的排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是不稳定的算法
希尔排序没有 快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的 数据排序不是最优选择。
希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的 排序算法.
增量:
举例:n=10
49, 38, 65, 97, 26, 13, 27, 49, 55, 4
gap = n;
gap = gap/2;
49-13 38-27 65-49 97-55 26-4
排序后:13 27 49 55 4 49 38 65 97 26
gap = gap/2;
13-49 27-55 49-4 55-49 4-38 49-65 38-97 65-26
排序后:4 26 13 27 38 49 49 55 97 65
gap = gap/2;
排序后:4 13 26 27 38 49 49 55 65 97
代码:(从小到大)
#include <stdio.h> //3 7 6 5 1 0 //3 5 //7 1 //6 0 //7 6 5 3 1 0 void aaa(int a[],int n) { int gap = n,flag = 0; int i,j,t; while(gap > 1) { gap /= 2; do { flag = 0; for(i=0;i<n-gap;i++) { j = gap+i; if(a[j]<a[i]) { t = a[j]; a[j] = a[i]; a[i] = t; flag = 1; } } }while(flag != 0); } } int main() { int i,j,t; int a[12]={0}; for(i=0;i<6;i++) { scanf("%d",&a[i]); } aaa(a,6); for(i=0;i<6;i++) { printf("%d ",a[i]); } return 0; }