【C++】排序算法小结
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++】排序算法小结的更多相关文章
- C#排序算法小结
前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构组成的.但是这不意味着算法对于每个软件设计人员的实际工作都是很重要的 ...
- 排序算法小结:C++实现
#include<vector> #include<iostream> //排序算法的稳定性:对于相同的关键字,排序之前的位置和排序之后的位置相同,则称为稳定排序,否则不稳定排 ...
- C#排序算法
随笔- 41 文章- 0 评论- 25 C#排序算法小结 前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构 ...
- 剑指Offer--排序算法小结
剑指Offer--排序算法小结 前言 毕业季转眼即到,工作成为毕业季的头等大事,必须得认认真真进行知识储备,迎战笔试.电面.面试. 许久未接触排序算法了.平时偶尔接触到时自己会不假思索的百度,然后就是 ...
- 【路飞学城Day170】算法小结
Evernote Export 算法的思想是能省则省,内存能少则少,时间运行能少尽量少 堆排序的时间复杂度O(nlogn) 堆排序的内置模块heapq 常用函数 heapify(x) heappush ...
- 贝叶斯个性化排序(BPR)算法小结
在矩阵分解在协同过滤推荐算法中的应用中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personal ...
- 用HTML5实现的各种排序算法的动画比较 及算法小结
用HTML5实现的各种排序算法的动画比较 http://www.webhek.com/misc/comparison-sort/ 几种排序算法效率的比较 来源:http://blog.chinauni ...
- 第23章 排序算法(包括merge等)
第23章 排序算法 Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...
- 常见排序算法基于JS的实现
一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...
随机推荐
- 【弱省胡策】Round #0 Flower Dance DP
Flower Dance Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://162.105.80.126/contest/%E3%80%90%E ...
- mySql---logback日志写入数据库(mysql)配置
如题 建议将日志级别设置为ERROR.这样可以避免存储过多的数据到数据中. 1 logback 配置文件(如下) <?xml version="1.0" encoding ...
- 阻止a标签跳转
一.在html中 1. <a href="javascript:;"></a> 2. <a href="###">&l ...
- 28个Java常用的工具类
源码下载:http://pan.baidu.com/s/1pJLSczD Base64.javaBase64DecodingException.javaCConst.javaCharTools.jav ...
- 开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表( 附加翻译) h2数据库
开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表 浪天涯博主翻译: referential integrity 参考完整性transactions 事 ...
- Nagios 监控mysqlserver具体实现过程
,之后在页面就能够看到监控效果了 參考文章:http://os.51cto.com/art/201409/452605.htm
- Andorid之Annotation框架初使用(二)
Fragment: @EActivity(R.layout.fragments) public class MyFragmentActivity extends FragmentActivity { ...
- threading.local()、多线程里全局变量锁
这个人的系列文章值得一读:http://blog.51cto.com/suhaozhi/category3.html/p2,不过这个系列总共15偏,Python并发入门,有很多文字描述错误,有些道理也 ...
- Java设计模式之生产者消费者模式
Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...
- T-sql 根据bak文件恢复新建数据库
利用bak文件恢复新建数据库: 1:利用sqlserver界面管理工具恢复,在操作2005以上的版本可以讲界面的操作过程生成sql语句(本人在此徘徊了好久,得一位博友提醒才恍然大悟); 2:利用sql ...