希尔排序

点击查看代码
/*希尔排序
希尔排序又称缩小增量排序
希尔排序的思想是:
先选定一个整数,把待排序数组中所有元素分成gap个组,然后将相差gap个位置(gap也称为步长)的元素分在同一个组内,再分别对gap个组各自进行直接插入排序。
后续每一轮将gap缩小为原来的一半,继续重复分组和排序工作,当gap=1时就表示所有元素都在同一个组内,然后再排序一次就能得到有序序列
gap的选择有很多种,初始值一般可以设为待排序元素个数n的一半
*/
#include <iostream>
using namespace std;

/*
函数功能:对每个组各自进行直接插入排序
函数列表:
a[]:待排序数组
n:待排序元素个数
gap:步长
group:当前分组号
*/
void GroupSort(int a[], int n, int gap, int group) { 
    int i; //第group组的索引   
    //在第group组中,将相隔gap个位置的元素取出组成一个组
    for (i = group + gap; i < n; i += gap) {      
        if (a[i] < a[i - gap]) { //在第group组中,后一个元素小于前一个元素,则对该组进行直接插入排序
            int tmp = a[i]; //暂存待插入元素a[i]
            int j = i - gap; //在第group组中,前一个元素的下标j=i-gap
            //直接插入排序
            while (j >= 0 && a[j] > tmp) { 
                a[j + gap] = a[j]; //将前一元素后移
                j = j - gap; //j继续向前查找
            }
            a[j + gap] = tmp; //排序结束,插入tmp(退出while循环时多减了gap,因此j+gap才是插入位置)
        }
    }
}

//希尔排序(升序排序)
void ShellSort(int a[], int n) { 
    int gap, group; //gap为步长,group为当前排序的第x组
    //希尔规则:起始步长为n/2,后续每次缩小为原来的一半
    //步长为X表示有X个组,即有gap个组,对每一组都执行步长为gap的直接插入排序
    for (gap = n / 2; gap > 0; gap /= 2) {
        for (group = 0; group < gap; group++) {
            GroupSort(a, n, gap, group);
        }               
    }            
}

int main() {
    int a[] = { 80,30,60,40,20,10,50,70 };
    int n = (sizeof(a)) / (sizeof(a[0]));
    cout << "序列个数:" << n << endl;
    cout << "排序前:";
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
    ShellSort(a, n); //希尔排序
    cout << "排序后:";
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}

posted @ 2022-09-25 14:45  zhaoo_o  阅读(2)  评论(0编辑  收藏  举报