排序算法总结(C++版)
总结下学过的排序算法,方便以后用到。
1.插入排序——将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。
void insertSort(int a[],int len)
{
for(int i = ;i < len;i ++)
{
int j = i;
int x = a[j]; //要插入的数
while(j > && x < a[j - ]) //将大的数推上去,空出个位置
{
a[j] = a[j - ];
j--;
}
a[j] = x; //插入
}
}
2.冒泡排序——不断地比较相邻2个数的大小,大的就推到后面,最后把最大值推到了最后,依次类推。
void swap(int &a,int &b)
{
int tmp = a;
a = b;
b = tmp;
} void bubbleSort(int a[],int len)
{
for(int i = len - ;i > ;i --)
for(int j = ;j < i;j ++)
if(a[j] > a[j + ])
swap(a[j],a[j + ]);
}
3.选择排序——第一次选出数组中最小的数与第一个数交换位置,第二次选出第二小的与第二个数交换位置,以此类推。
//swap函数见上。
void selectSort(int a[],int len)
{
for(int i = ;i < len - ;i ++)
{
int min = a[i];
int minPos = i;
for(int j = i + ;j < len;j ++)
{
if(a[j] < min)
{
min = a[j];
minPos = j;
}
}
if(minPos != i)
swap(a[i],a[minPos]);
}
}
4.归并排序——将一个序列分成2个长度相等的子序列,分别排序,然后再将它们合并成一个有序的序列。(合并的过程比较麻烦,这里利用一个辅助数组来将排好序的子序列先复制过去,然后再归并回原数组)
void mergeSortHelp(int a[],int tmp[],int left,int right)
{
if(left == right)
return;
int mid = (left + right) / ;
mergeSortHelp(a,tmp,left,mid);
mergeSortHelp(a,tmp,mid + ,right);
for(int i = left;i <= right;i ++)
tmp[i] = a[i];
int i = left;
int j = mid + ;
int k = left;
while(k <= right)
{
if(j > right)
a[k++] = tmp[i++];
else if(i > mid)
a[k++] = tmp[j++];
else if(tmp[i] < tmp[j])
a[k++] = tmp[i++];
else a[k++] = tmp[j++];
}
} void mergeSort(int a[],int len)
{
int *tmp = new int[len];
mergeSortHelp(a,tmp,,len - );
delete []tmp;
}
5.快速排序——选择数组中的一个数作为轴值(这里选择第一个数),将小于轴值的数放到左边,大的放到右边,轴值放中间,这样只需要各自递归快排左右两边数组,完成排序。
//swap函数见上上上
int partition(int a[],int left,int right)
{
int pivotPos = left; //记录轴值位置
int pivot = a[left]; //取最左边的值作为轴值
left ++; //避开轴值
while(left < right) //从左右两边各自扫描数组,左边遇到比轴值大的就停下,右边遇到比轴值小的就停下,交换。继续。。。
{
while(a[left] < pivot && left < right)
left++;
while(a[right] > pivot && left < right)
right--;
swap(a[left],a[right]);
}
if(a[right] < a[pivotPos])
{
swap(a[right],a[pivotPos]);
return right;
}else
{
swap(a[right - ],a[pivotPos]);
return right - ;
}
} void quickSortHelp(int a[],int left,int right)
{
if(left >= right)
return; int k = partition(a,left,right); //通过partition将数组按比轴值大小分别放到轴值左右两边,返回最后轴值的位置k。 quickSortHelp(a,left,k - );
quickSortHelp(a,k + ,right);
}
void quickSort(int a[],int len)
{
quickSortHelp(a,0,len - 1);
}
6.堆排序(夜深下次再写)
排序算法总结(C++版)的更多相关文章
- 常见排序算法(JS版)
常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...
- 十大经典排序算法总结——JavaScrip版
首先,对于评述算法优劣术语的说明: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:即排序后2个相等键值的顺序和排序之前它们的顺序相同 不稳定:如果a原本在b的前面,而a=b,排序之后a ...
- 十大经典排序算法的JS版
前言 个人博客:Damonare的个人博客 如遇到问题或有更好的优化方法,可以: 提issue给我 或是pull requests 我都会看到并处理,欢迎Star. 这世界上总存在着那么一些看似相似但 ...
- 选择排序---直接选择排序算法(Javascript版)
在要排序的一组数列中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个 ...
- 【Unity3D自学记录】可视化对照十多种排序算法(C#版)
在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是 ...
- 面试常用算法总结——排序算法(java版)
排序算法 重要性不言而喻,很多算法问题往往选择一个好的排序算法往往问题可以迎刃而解 1.冒泡算法 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个 ...
- 排序算法总结(C#版)
算法质量的衡量标准: 1:时间复杂度:分析关键字比较次数和记录的移动次数: 2:空间复杂度:需要的辅助内存: 3:稳定性:相同的关键字计算后,次序是否不变. 简单排序方法 .直接插入排序 直接插入排序 ...
- 排序算法(java版)
一直想理解一下基本的排序算法,最近正好在搞java所以就一并了(为了便于理解,这儿都是以从小到大排序为目的) 冒泡排序 也就是比较连续的两个值,如果前面一个值大于后面一个值,则交换. 时间复杂度为O( ...
- 经典排序算法(Java版)
1.冒泡排序 Bubble Sort 最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡” ...
- 排序算法 Java实现版
8种排序之间的关系: 1. 直接插入排序 (1)基本思想: 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序 ...
随机推荐
- 简单CSS 布局
CSS Layout CSS Layout 是对上下左右布局的一个简单封装,主要针对自己项目里面方便使用. 坚持组合大于继承的原则,复杂的布局也是由简单布局组成的. 所以不习惯margin/paddi ...
- mongoose api 图表整理
一.背景 今天看 mongoose 的基础 API,参考了下面的链接做了图表以供查阅. 参考资料: http://www.cnblogs.com/xiaohuochai/p/7215067.html ...
- 初识ELF格式 ABI,EABI,OABI
尽管每天都在调用linux的elf文件做各种事,但却很少去了解他,最近尝试在orangepi上编译个elf到android手机上运行,因为两个CPU都是ARMv8的.结果运行失败了.遂查找原因.结果挖 ...
- JVM菜鸟进阶高手之路二(JVM的重要性,Xmn是跟请求量有关。)
转载请注明原创出处,谢谢! 今天看群聊jvm,通常会问ygc合适吗? 阿飞总结,可能需要2个维度,1.单位时间执行次数,2.执行时间 ps -p pid -o etime 查看下进程的运行时间, 17 ...
- C++中const几中用法
转载自:http://www.cnblogs.com/lichkingct/archive/2009/04/21/1440848.html 1. const修饰普通变量和指针 const修饰变量,一般 ...
- PHP防SQL注入攻击
PHP防SQL注入攻击 收藏 没有太多的过滤,主要是针对php和mysql的组合. 一般性的防注入,只要使用php的 addslashes 函数就可以了. 以下是一段copy来的代码: PHP代码 $ ...
- 解决linux下部署科大讯飞时的版本过低问题
在将项目部 署到阿里云服务器之后,需要将科大讯飞SDK下的libmsc64.so依赖库文件上传至/usr/java/jdk1.8.0_121/jre/lib/amd64路径下 在Windo ...
- Qt下 QString转char*
Qt下面,字符串都用QString,确实给开发者提供了方便.Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 Qt再使用第三方开源库时,由于库的类型基本上都 ...
- 关于select的一个错误---属性选择器
错误: jquery 获取下拉框 text='1'的 option 的value 属性值 我写的var t= $("#selectID option[text='1']).val() ; ...
- 用ES6巧妙的解决传统面试中的算法小问题!
最近自己也在准备面试,在复习算法的时候,机智的用了一波ES6.一起来瞧瞧吧! 1.数组的去重 var arr=str.split(''); for(var i=0;i<arr.length-1; ...