一、Shell排序算法的介绍
希尔排序,也称递减增量排序算法,是直接插入排序算法的一种高速而稳定的改进版本。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量=1(<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
二、Shell排序算法严格来说是基于插入排序的思想的,其又称为希尔排序或者缩小增量排序。Shell
排序算法的排序流程如下:
(1)将有n个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一对,
(2) 一次循环使每一个序列对排好顺序。
(3)然后,再变为n/4个序列,再次排序。
(4)不断重复上述过程,随着序列减少最后变为一个,也就完成了整个排序。
三、例子
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
void ShellSort(int data[], int n) {
for(int r = n / 2; r >= 1; r /= 2) {
for(int i = r; i < n; i += r) {
int temp = data[i];
int j = i - r;
while(j >= 0 && temp < data[j]) {
data[j + r] = data[j];
j -= r; }
data[j + r] = temp; } } }
int main() {
int mydata[10] = {2, 1, 3, 4, 6, 5, 8, 7, 10, 9};
ShellSort(mydata, 10);
for(int i = 0; i <= 9; i++) {
cout<<mydata[i]<<" "; }
return 0; }