排序之希尔排序(Shell Sort)

来源:互联网 发布:mac怎么从u盘启动 编辑:程序博客网 时间:2024/05/22 12:25

希尔排序(Shell Sort):又叫缩小增量排序,该方法是直接插入排序的改进,其实质就是分组直接插入排序

我们还记得直接插入排序对基本有序的序列排序时,效率很高;由此思想得出希尔排序;


基本思想:

    先将待排序序列分成若干个子序列(由相距同等增量的元素组成),然后分别对分组序列进行直接插入排序;

     缩小增量,依据增量再次分组排序。待到整个序列基本有序时,整体进行直接插入排序;


算法操作步骤:

    1)选择某一增量序列:gap1 , gap2......gapk,其中gapi > gapj,gapk = 1;

     2)按照给定增量序列个数K,需要进行K趟排序;

     3)每趟排序中,根据给定增量gapi,将序列分成程度为m的不同子序列,对子序列进行直接插入排序;


算法实现:

#include<iostream>using  namespace std;//-------------------------------------------------------希尔排序 --------------------------------------------------------------------------void ShellSort_Soulation1(int* data , int dLength){if(data == NULL ||dLength <= 0)return;int i , j , gap;//gap 步长for(gap = dLength / 2; gap > 0; gap /= 2)for(i = 0; i < gap; i++){//小组插入排序for(j = i + gap; j < dLength; j += gap){if(data[j] < data[j - gap]){int temp = data[j];int k = j - gap;while(k >=0 && data[k] > temp){data[k + gap] = data[k];      k -= gap;}data[k + gap] = temp;}}}}void ShellSort_Soulation2(int* data , int dLength){if(data == NULL || dLength <= 0)return;int i , j , gap;for(gap = dLength / 2; gap > 0; gap /= 2)for(i = gap; i < dLength; i++)for(j = i - gap; j >= 0 && data[j] > data[j + gap]; j -= gap)//数据交换代替数据依次后移,会简洁些;swap(data[j] , data[j + gap]);}


原创粉丝点击