各主流排序算法详细介绍
Posted csuchenzc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各主流排序算法详细介绍相关的知识,希望对你有一定的参考价值。
一,插入排序
插入排序基本思想:
在一个已经有序的序列里插入新的元素,直到有序序列包含所有被排序元素。
例子:
代码实现:
void InsertSort(vector<int> &v) { for(int i = 1;i < v.size(); ++i)//i表示有序集合里的元素数目和待插入元素下标 { for(int j = i; j > 0 && v[j-1] > v[j]; --j) { int temp = v[j-1]; v[j-1] = v[j]; v[j] = temp; } } }
时间复杂度为O(N^2)
空间复杂度为O(1)
插入排序在小规模数据时或者基本有序时比较高效。
二,希尔排序
希尔排序基本思想:
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。本质上是分组插入排序。
例子:
在取增量d的时候一般有以下要求:
①最后一次排序d = 1;
②每次取的d并不包含处1以外的公因子;
③采用缩小增量法,d的取值逐步缩小。
代码实现:
void ShellSort(vector<int> &v) { int k = 0; int t = v.size() - 1; int delta = 2*t - k - 1;//有研究表明,delta取2*t-k-1时时间复杂度可达O(N^1.5) for(k = 0;k < v.size(); ++k) { delta = (2*t-k-1) == t?(2*t-k-1):1;//最后一次delta要取1 for(int i = 0; i < v.size()-delta; ++i) { if(v[i] > v[i+delta]) { int temp = v[i]; v[i] = v[i+delta]; v[i+delta] = temp; } } } }
希尔排序delta开始会很大,所以该排序不稳定。
希尔排序的复杂度与delta相关:
{1,2,4,8,...}使用这个增量序列的时间复杂度(最坏情形)是O(N^2)
代码中所给序列的时间复杂度时O(N^1.5)
空间复杂度为O(1)
希尔排序为插入排序的一种优化,其适用范围为:大规模且无序的数据。
未完待续!
以上是关于各主流排序算法详细介绍的主要内容,如果未能解决你的问题,请参考以下文章