【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个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...
随机推荐
- 读书笔记_Effective_C++_条款二十七:尽量少做转型动作
有关转型的几种做法,已经在早些的博客中写过了.这里先简单回顾一下,再讲一讲effective中对之更深入的阐述. 转型可以按风格可以分成C风格转型和C++风格转型两大类,C风格转型很容易看到,因为我们 ...
- mybatis源码分析(5)-----拦截器的实现原理(动态代理+责任链)
写在前面 MyBatsi 的拦截器模式是基于代理的代理模式.并且myBatis 的插件开发也是以拦截器的形式集成到myBatis 当中. MyBatis 的拦截器已经插件是在org.apache.ib ...
- Ext.js 中 25种类型的Ext.panel.Tool
通过Ext.panel.Panel的tools配置项来设置Ext.panel.Tool实例. 要注意的一点是,Ext框架提供的Ext.panel.Tool仅包含按钮图标而具体的点击事件处理函数需要我们 ...
- Druid 连接泄漏监测
当程序存在缺陷时,申请的连接忘记关闭,这时候,就存在连接泄漏了.Druid提供了RemoveAbandanded相关配置,用来关闭长时间不使用的连接.例如: 配置 <bean id=" ...
- Div+CSS展示物流跟踪轨迹信息
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- delphi 搭建安卓开发环境
delphi 搭建安卓开发环境 DELPHI安装成功以后,怀着激动的心情,使用IDE向导生成安卓DEMO程序,BUILD,想马上看到编译成功的提示,结果报错,不由得傻眼了.DELPHI怎么这么差? 原 ...
- Android 信息分享实现
一.短信分享 01Intent intent = new Intent(Intent.ACTION_SEND);02// intent.setType("text/plain"); ...
- cocos2d-x hello world及安卓平台迁移
本节和大家一起新建一个项目工程,并通过cygwin迁移至android平台. 以下是本节主要内容: 利用cocos2d-x自带脚本,生成测试工程,并测试运行: 将该测试项目通过cyg ...
- Jacob的使用出错总结
转自:http://blog.163.com/wm_at163/blog/static/13217349020114166447941/ Jacob的使用方法: 1.在工程中导入 jacob.jar ...
- redis的主从配置 扩容
由于redis的集群功能没有完全编写好,见:http://redis.io/topics/cluster-spec 集群只有测试版的第8个版本redis3.0.0 见 http://redis.io/ ...