希尔排序的基本思想
1.希尔排序,也称作递减增量排序,是插入排序的一种更高效的改进版本,可将时间复杂度将至o(n^2)以下。
2.希尔排序是基于插入排序的以下两点性质来改进的:
- 传统插入排序时间复杂度为o(n^2),每轮排序内,元素后移只能移动1位;
- 插入排序在对几乎已经排好序的数据操作时,效率高,可以达到线性排序的效率;
3.排序步骤:
- 设step为步长,将待排序元素按步长分为多个组;
- 对每个组进行插入排序,先让数列做到“组际”有序,然后减小步长,重复上述步骤,直到步长降为1,最后再使用一次插入排序,整个数列即可全部有序。
注:希尔排序是非稳定排序算法
代码实现
#include <iostream>
#include <time.h>
#include <algorithm>
using namespace std;
/*排序方法类*/
class MySort {
private:
int n;
int* A;
public:
//构造函数 ,便于挑选不同的排序方法
MySort(int N) {
this->n = N;
A = new int[this->n];
this->SetArray();
}
//随机初始化数组
void SetArray() {
srand(time(0));
for (int i = 0; i < n; i++) {
A[i] = rand() % 100 + 1;
}
}
//打印数组
void Print() {
for (int i = 0; i < n; i++) {
cout << A[i] << " ";
}
cout << endl;
}
//交换函数
void Swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
//希尔排序
void shell_Sort() {
int istep = n / 2; //以初始步长为n/2分组
while (istep > 0) { //每次组际排序后,将步长缩为一半,直到步长为1
for (int i = 0; i < istep; i++) {
group_sort(i, istep); //以组为单位排序,元素每次跳跃移动istep个位置
}
istep /= 2;
}
}
void group_sort(int ipos, int istep) { //ipos分组起始位置,istep分组步长
int itmp; //存放待排元素
int j;
//原理与插入排序相同,只是前后移动的位数由1变为istep
for (int i = ipos + istep; i < n; i++) {
itmp = A[i];
for (j = i - istep; j >= 0; j-=istep) {
if (A[j] <= itmp) break;
A[j + istep] = A[j];
}
A[j + istep] = itmp;
}
}
};
int main(){
//初始化数组
int N;
cout << "请输入数组长度:";
cin >> N;
MySort sort(N); //构造排序方法
cout << endl;
cout << "获得"<<N<<"位随机数组:" ;
sort.Print();
sort.shell_Sort(); //希尔排序
cout << "希尔排序后:";
sort.Print();
cout << endl;
return 0;
}
结果验证: