排序算法之希尔排序
前言
从此篇开始将介绍较为高级的排序算法,相信大家已经发现,前面的几篇算法的时间复杂度表现并不优秀,下面将介绍时间复杂度表现不错的几种排序算法
其中很多用到了分治法的思想,望大家多多体会
排序原理
官话:
1、选定一个增量长,按照增量长h作为数据分组的依据。对数据进行分组
2、对分好组的每一组数据完成插入排序
3、减小增量长,最小为1,
void get_h(int array_length) {
int h = 1;
while (h < array_length / 2) {
h = 2 * h + 1;
}
}
白话:
这相当于是一个捉组的过程,第一次捉的方法类似于物理的逐差法,“逐差”的距离逐渐减小,最终减小为1,变成整个数组的排列,在这个过程中,我们对于每一次捉到的对进行需要的顺序调整,到最后实现整个数组的顺序排列
时间复杂度
此处由于h属于动态变化,属于无法分析的范畴
C++实现
#include <iostream>
using namespace std;
void ShellSort(int a[], int lenth) {
int temp;//用于存储用来插入的数据
int gap = lenth / 2;//第一次调整gap的值
while (gap >= 1) {//当循环终止时gap = 0,即上一个gap为1
for (int i = gap; i < lenth; i++) {//循环捉组
temp = a[i];
int j = i;
while (j >= gap && temp < a[j - gap]) {//组内排序
a[j] = a[j - gap];
j -= gap;
}
a[j] = temp;
}
gap = gap / 2;
}
}
int main()
{
int sample[10] = { 2,4,1,3,23,5,7,0,11,14 };
ShellSort(sample, 10);
for (int i = 0; i < 10; i++) {
cout << sample[i] << endl;
}
return 0;
}