【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个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...
随机推荐
- SSM+Maven(教程二):Idea快速入门SSM+Maven框架。
快速入门须知 这篇文章,直接应用已经搭建好的SSM框架.一般在公司里面,考虑框架的搭建.封装等问题,都由研发经理或者架构师完成,所以对于刚入门的小白来说,在去搭建整合花费的时间会很多很多.对于理解能力 ...
- Registering DLL and ActiveX controls from code
http://delphi.about.com/od/windowsshellapi/l/aa040803a.htm How to register (and unregister) OLE cont ...
- [Projet] Module NFC
http://www.f4grx.net/projet-module-nfc/ The NFC is a contactless communication technology, which is ...
- mysql select语句执行顺序
SELECT语句定义 一个完成的SELECT语句包含可选的几个子句. SELECT语句的定义如下: <SELECT clause> [<FROM clause&g ...
- unity基础开发----unity游戏速度更快的简易检查表
让游戏速度更快的简易检查表 保持顶点数在 200K 下面,针对 PC 时每帧应为 3M,主要取决于目标 GPU. 若使用内置着色器,请在移动 (Mobile) 或未点亮 (Unlit) 的类别中选择. ...
- ecmall用户登录后自动退出解决方法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- ASP.NET Core 1.0基础之应用启动
来源https://docs.asp.net/en/latest/fundamentals/startup.html ASP.NET 5 使得应用对每个http请求有完整的控制权.Startup类是程 ...
- struts2 action通配符
首先,看一个struts2的配置文件: <package name="actions" extends="struts-default" namespac ...
- s:iterator数据累加示例代码
<s:set var="xs_heji" value="0" /> <s:set var="km_heji" value= ...
- Android RecyclerView (一) 使用完全解析
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45059587: 本文出自:[张鸿洋的博客] 概述 RecyclerView出现 ...