排序--希尔排序的实现(shellsort)
2017-12-01 23:36
585 查看
一、简介
希尔排序是插入排序的一种,它是插入排序的一种优化,它在插入排序之前使用了一个预排序,使整个数组接近有序,方便后续的排序。在网上看到一个动态,这个动图很形象的说明了希尔排序的思想,所以我把它放出来。
下面我给出一道例题来说明希尔排序。
例:如果初始数组里面存放的内容是9 8 7 6 5 4 3 2 1 0,进过希尔排序后的数组为0 1 2 3 4 5 6 7 8 9,所以整个排序的过程如下图所示。
二、时间复杂度
时间复杂度O(N^1.3),相比于直接插入排序,在顺序情况下不如直接插入排序。三、实现
1. 第一个阶段预排序(接近于有序)
采用分组来先排序一遍,使小的数据排在前面,大的数据排在后面,使接下来排序的时候可以更方便。Gap越大,使第一阶段排序越不有序,所以Gap是个变化值,和数组大小有关,数组越大,Gap越大,Gap可以用Gap/3+1来实现,此处的+1保证最后一次一定是1(例:如果gap是6最后会是0)
实现过程中采用的代码是,每组都是一起找完。
2. 第二个阶段直接插入排序
由第一个阶段进行的分组数据,直接对每个分组进行插入排序即可。四、代码实现
#include <iostream> using namespace std; //这个写法最简便 //主要是把所有的控制在了一个里面 void ShellSort(int* arr,int len) { //这个写法。 int gap = len; //大于1以上排序 while (gap > 1) { //每次gap减小即可,一直到1为止。 gap = gap / 3 + 1; for (size_t i = 0; i < len - gap; ++i) { //由于上面的for循环直接判断了i不等于arr[i+gap] //并且我们确定gap的方式导致了arr[i+gap]一定存在 int end = i; int j = arr[end + gap]; //注意这里一定要大于等于0 //自己在第一次写的时候没有等于0 while (end >= 0 && arr[end] > j) { arr[end + gap] = arr[end]; end -= gap; } arr[end + gap] = j; } } } int main() { //int arr[] = { 5,4,8,6,1,5,4,3,1,0 }; int arr[] = { 9,8,7,6,5,4,3,2,1,0 }; //int arr[] = { 2,1 }; //int arr[] = { 3,2,1 }; //int arr[] = { 6,3,1 }; int len = sizeof(arr) / sizeof(arr[0]); //HashSort(arr); ShellSort(arr, len); for (size_t i = 0; i < len; i++) cout << arr[i] << " "; cout << endl; return 0; }
相关文章推荐
- C++实现谢尔排序(希尔排序)(shell sort)
- 数据算法之希尔排序(shellSort)的Java实现
- 排序之希尔排序(Shell Sort)
- 排序_Shell_Sort(希尔排序)
- 希尔排序(Shell Sort)——插入排序法(Java实现)
- 数据算法之希尔排序(shellSort)的Java实现
- 希尔排序(shellsort)算法实现
- 插入排序之希尔排序(Shell Sort)
- 排序 —— 希尔排序(Shell sort)
- UVa Problem 10152 ShellSort (龟壳排序)java实现
- 排序1+3:基数排序(RadixSort),希尔排序(ShellSort)和快速排序(QuickSort)
- 用python实现希尔排序(shell_sort)
- 【排序算法 】希尔排序 shell sort(插入类排序)
- 【DS】排序算法之希尔排序(Shell Sort)
- 排序1+3:基数排序(RadixSort),希尔排序(ShellSort)和快速排序(QuickSort)
- 【内部排序】三:希尔排序(Shell Sort)的多种实现(不断优化+源码)
- PHP实现排序算法----希尔排序(Shell Sort)
- 排序_Shell_Sort(希尔排序)更正版
- uva 10152 ShellSort 龟壳排序(希尔排序?)
- 希尔排序实现(ShellSort) Java数据结构与算法