1、计数排序

如果给定上下界,并且区间不大的话,最适用。

比如对于英文字母数组进行排序。

时间复杂度O(n),空间复杂度O(n)

void countSort(int A[], int n, int low, int high)
{
int size = high-low+;
vector<int> count(size, ); //count[i] represents low+i appears count[i] times in A
for(int i = ; i < n; i ++)
{
count[A[i]-low] ++;
}
int ind = ;
for(int i = ; i < size; i ++)
{
while(count[i])
{
A[ind ++] = low+i;
count[i] --;
}
}
}

2、冒泡排序(基础版)

最基础的排序算法,相邻元素两两比较并交换。

时间复杂度O(n2),空间复杂度O(1)。稳定排序。

void bubbleSort(int A[], int n)
{
for(int i = ; i < n; i ++)
{
for(int j = ; j < n-i-; j ++)
{
if(A[j] > A[j+])
swap(A[j], A[j+]);
}
}
}

3、冒泡排序(加速版)

如果中间结果已经有序,即一次遍历过程中不存在需要交换的相邻元素,则结束返回。

时间复杂度O(n2),空间复杂度O(1)。稳定排序。

void bubbleSortAc(int A[], int n)
{
bool exchange;
for(int i = ; i < n; i ++)
{
exchange = false;
for(int j = ; j < n-i-; j ++)
{
if(A[j] > A[j+])
{
exchange = true;
swap(A[j], A[j+]);
}
}
if(exchange == false)
return;
}
}

4、选择排序

遍历过程中选择最大元素,与末尾元素交换。

时间复杂度O(n2),空间复杂度O(1)。不稳定排序。

void selectSort(int A[], int n)
{
for(int i = n-; i >= ; i --)
{
int max = A[];
int ind = ;
for(int j = ; j <= i; j ++)
{
if(A[j] > max)
{
max = A[j];
ind = j;
}
}
if(ind != i)
swap(A[ind], A[i]);
}
}

5、插入排序

将当前元素插入局部有序的数组中。

时间复杂度O(n2),空间复杂度O(1)。稳定排序。

void insertSort(int A[], int n)
{
for(int i = ; i < n; i ++)
{//insert A[i] into the right place
int cur = i-;
int value = A[i];
while(cur >= && A[cur] > value)
{
A[cur+] = A[cur];
cur --;
}
A[cur+] = value;
}
}

6、快速排序

最常用的排序,使用pivot将数组分成大小两段,递归完成排序。

时间复杂度平均O(nlogn),最坏情况(已排序或逆序)O(n2),空间复杂度O(1)。不稳定排序。

int partition(int A[], int low, int high)
{
int pivot = A[low];
int vacant = low;
while(low < high)
{
while(high > low && A[high] >= pivot)
high --;
//A[high] < pivot
if(high > low)
{
A[vacant] = A[high];
vacant = high;
}
else
break; while(low < high && A[low] <= pivot)
low ++;
//A[low] > pivot
if(low < high)
{
A[vacant] = A[low];
vacant = low;
}
else
break;
}
A[low] = pivot;
return low;
}
void quickSort(int A[], int low, int high)
{
if(low < high)
{
int pos = partition(A, low, high);
quickSort(A, low, pos-);
quickSort(A, pos+, high);
}
}

7、堆排序

分为建堆与交换两个过程。

通常用于数组中寻找最大/小的k个元素。

时间复杂度O(nlogn),空间复杂度O(1)。不稳定排序。

void siftDown(int A[], int start, int end)
{
int temp = A[start];
int i = start;
int j = *i + ; //left child
while(j <= end)
{
if(j+ <= end && A[j]<A[j+])
j = j+; //choose the bigger
if(temp >= A[j])
break;
else
{
A[i] = A[j];
i = j;
j = *i + ;
}
}
A[i] = temp;
}
void heapSort(int A[], int n)
{
//build max heap
for(int i = (n-)/; i >= ; i --)
siftDown(A, i, n-); //sort
for(int i = n-; i >= ; i --)
{
swap(A[], A[i]);
siftDown(A, , i-); //not include the i_th node
}
}

8、归并排序

分为局部排序与有序归并。

通常用于内存不足,需要与硬盘交互的排序。

时间复杂度O(nlogn),空间复杂度O(n)。稳定排序。

void merge(int A[], int start, int mid, int end)
{
int size1 = mid-start+;
int* L = new int[size1];
for(int i = ; i < size1; i ++)
L[i] = A[start+i];
int size2 = end-mid;
int* R = new int[size2];
for(int i = ; i < size2; i ++)
R[i] = A[mid++i]; int i = ;
int j = ;
int ind = start;
while(i < size1 && j < size2)
{
if(L[i] <= R[j])
{
A[ind] = L[i];
ind ++;
i ++;
}
else
{
A[ind] = R[j];
ind ++;
j ++;
}
}
while(i < size1)
{
A[ind] = L[i];
ind ++;
i ++;
}
while(j < size2)
{
A[ind] = R[j];
ind ++;
j ++;
}
}
void mergeSort(int A[], int start, int end)
{
if(start < end)
{
int mid = (start+end)/;
mergeSort(A, start, mid);
mergeSort(A, mid+, end);
merge(A, start, mid, end);
}
}

【C++】排序算法小结的更多相关文章

  1. C#排序算法小结

    前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构组成的.但是这不意味着算法对于每个软件设计人员的实际工作都是很重要的 ...

  2. 排序算法小结:C++实现

    #include<vector> #include<iostream> //排序算法的稳定性:对于相同的关键字,排序之前的位置和排序之后的位置相同,则称为稳定排序,否则不稳定排 ...

  3. C#排序算法

    随笔- 41  文章- 0  评论- 25  C#排序算法小结   前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构 ...

  4. 剑指Offer--排序算法小结

    剑指Offer--排序算法小结 前言 毕业季转眼即到,工作成为毕业季的头等大事,必须得认认真真进行知识储备,迎战笔试.电面.面试. 许久未接触排序算法了.平时偶尔接触到时自己会不假思索的百度,然后就是 ...

  5. 【路飞学城Day170】算法小结

    Evernote Export 算法的思想是能省则省,内存能少则少,时间运行能少尽量少 堆排序的时间复杂度O(nlogn) 堆排序的内置模块heapq 常用函数 heapify(x) heappush ...

  6. 贝叶斯个性化排序(BPR)算法小结

    在矩阵分解在协同过滤推荐算法中的应用中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personal ...

  7. 用HTML5实现的各种排序算法的动画比较 及算法小结

    用HTML5实现的各种排序算法的动画比较 http://www.webhek.com/misc/comparison-sort/ 几种排序算法效率的比较 来源:http://blog.chinauni ...

  8. 第23章 排序算法(包括merge等)

      第23章 排序算法  Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...

  9. 常见排序算法基于JS的实现

    一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...

随机推荐

  1. kali 执行apt-get upgrade后,终端无法打开的解决办法

    今天在kali执行apt-get upgrade命令后,reboot启动,发现进入界面终端无法开启 一波百度,google发现大概应该是语言的配置问题,因为最开始安装kali的时候是选择中文,可能up ...

  2. linux下如何启动sybase

    isql -Dxxx -Uxxx -P111111 用isql连接数据库发现数据库没有启动. 如何启动sybase数据库? [TA_SYBASE][/home/bta]su - sybase  //切 ...

  3. IOS定位核心与地图

    IOS定位核心与地图                 Core Location以及Map框架包通常能给我们的应用程序添加定位和地图相关的服务.Core Location框架包通常是使用硬件设备来进行 ...

  4. nodejs之处理GET请求

    一个简单的httpserver.接收get请求,并返回解析之后的数据. 以下是服务的代码: var http = require("http"); var url = requir ...

  5. Eclipse里web的依赖工程部署的简便方法

    用Eclipse开发项目,曾经为依赖工程的部署问题头疼过,用了MyEclipse之后就没有仔细去研究,最近研究了下,还真找到了比较简便的方法,之前都是采用Ant打jar包,copy到web工程,或者通 ...

  6. javascript函数中的匿名函数

    一般写函数,我们会这样调用: function add(x, y) { return x + y; } alert(add(2, 3)); 或者这样: var add = function(x, y) ...

  7. 更为详细的介绍Hadoop combiners-More about Hadoop combiners

    Hadoop combiners are a very powerful tool to speed up our computations. We already saw what a combin ...

  8. Python学习(四)数据结构 —— list tuple range

    序列类型 list   tuple   range list 和 tuple list: 列表,由 [] 标识: 有序:可改变列表元素 tuple: 元组,由 () 标识: 有序:不可改变元组元素(和 ...

  9. django一对多 增 删 改 查

    实现一对多表查询功能 项目代码: models.py from django.db import models # Create your models here. class Classes(mod ...

  10. 怎样更爽地看PDF杂志

    下载了一些PDF的杂志,想着要是全屏双页显示,应该是很爽的,但是,下载了应该foxit reader,还是遇到一些问题: 1.全屏:F11即可 2.全屏后不双页:在选项中,"全屏" ...