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. 2015 UESTC 数据结构专题D题 秋实大哥与战争 SET的妙用

    D - 秋实大哥与战争 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 D ...

  2. SqlServer Base64解码中文

    最近在做一个和拥有TurboCRM相关的项目,其中需要取出客户信息的联系人字段,经过查看,这个字段在存入时用Base64加密过了 这个功能在应用层实现是很方便的,但是由于一些特殊原因,只能放到SqlS ...

  3. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  4. 【原】【Git】EGit强制覆盖本地文件

    今天带来的是EGit使用中有时会用到的一个技巧,强制覆盖本地.EGit强制覆盖远端(其实没有这个说法),在另一篇文章中写了http://www.cnblogs.com/guodongdidi/p/48 ...

  5. gridview 空数据绑定

    private void getDataBind() { DataTable dt = new DataTable(); dt.Columns.Add("id"); dt.Colu ...

  6. Cocos2d-x3.0 解压zip

    2dx3.0为我们集成了unzip库,帮助我们实现对文件的解压,但使用起来略显复杂我这里封装了一个解压工具库.分享一下. 工具类下载:http://download.csdn.net/detail/q ...

  7. Memcached源码分析——连接状态变化分析(drive_machine)

    这篇文章主要介绍Memcached中,基于libevent构造的主线程和worker线程所处理连接的状态互相转换的过程(不涉数据的存取等操作),也就是drive_machine的主要业务逻辑了.状态转 ...

  8. MNI模板和Talairach 模板的对比

    The MNI brain and the Talairach atlas SPM 96 and later use standard brains from the Montreal Neurolo ...

  9. JMS基本概念之二

    JMS规范  JMS定义了Java中访问消息中间件的接口,并没有给予实现,实现JMS接口的消息中间件称为JMS Provider,例如ActiveMQ JMS provider: 实现JMS接口和规范 ...

  10. iOS: 删除真机测试的Provisioning Profile后,在Code Singing中出现entitlements.plist文件无效,解决办法如下:

    问题主题:method to The entitlements specified in your application’s Code Signing Entitlements file do no ...