排序:希尔排序

目录

 

基本思想

C++实现

时间复杂度

  • 基本思想

  1. 使数组中间隔为d的元素有序。开始时,d选择大一些,每组的元素少,但是组数多。之后不断的缩小d,此时每组的元素变多,而组数变少。当d=1时,只有一个组,所有元素都在这个组中,此时排序完成。
  2. 举例

《排序:希尔排序》

  • C++实现


/*算法:希尔排序*/

#include <iostream>
using namespace std;

/*********************************************************
Function:swap
Description:交换a,b两个变量的值
**********************************************************/
void swap(int & a,int & b){
    int tmp = a;
    a = b;
    b = tmp;
}

/*********************************************************
Function:shsort
Description:希尔排序
Input:数组A[l,h]
Output:排序完成的数组A
*********************************************************/
void shsort(int A[],int l,int h){
    if(l<h){
        int d;//增量
        int tmp;
        int j;
        int size = h-l+1;
        for(d=size/2;d>=1;d/=2){
            //组内使用插入排序
            //d+l是第1组的第2个元素
            for(int i=d+l;i<=h;i++){
                tmp = A[i];
                j=i-d;//该组中,当前元素的前一个元素
                //寻找要插入的位置
                while(j>=l&&A[j]>tmp){
                    swap(A[j],A[j+d]);
                    j = j - d;
                }
                A[j+d] = tmp;
            }
        }
    }
}

int main(){
    int A[] = {3,1,2,8,-4,0,11};
    shsort(A,0,6);
    for(int i=0;i<7;i++)
        cout<<A[i]<<" ";
}

 

  • 时间复杂度

       希尔排序中增量的选择会影响时间复杂度,像上面的那种逐步折半的增量,最坏的时间复杂度为《排序:希尔排序》。经过优化的增量序列,可以使算法在最坏情况下的时间复杂度为《排序:希尔排序》

点赞