十大排序算法

主要排序法有:  
一、冒泡( Bubble)排序—— 相邻交换  
二、选择排序 ——每次最小/ 大排在相应的位置  
三、插入排序 ——将下一个插入已排好的序列中  
四、壳( Shell)排序—— 缩小增量  
五、归并排序  
六、快速排序  (待补充)
七、堆排序  (待补充)
八、拓扑排序  (待补充)
九、锦标赛排序  (待补充)
十、基数排序  (待补充)

1、冒泡( Bubble)排序 

基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

void BubbleSortArray()
{
for(int i=;i<n;i++)
{
for(int j=;i<n-i;j++)
{
if(a[j]>a[j+])//比较交换相邻元素
{
int temp;
temp=a[j];
a[j]=a[j+];
a[j+]=temp;
}
}
}
}

效率 O( n²), 适用于排序小列表。

2、选择排序

基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

void SelectSortArray()
{
int min_index;
for(int i=;i<n-;i++)
{
min_index=i;
for(int j=i+;j<n;j++)//每次扫描选择最小项
{
if(arr[j]<arr[min_index])
min_index=j;
}
if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置
{
int temp;
temp=arr[i];
arr[i]=arr[min_index];
arr[min_index]=temp;
}
}
}

效率O( n²),适用于排序小的列表。

3、 插入排序

基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

void InsertSortArray()
{
for(int i=;i<n;i++)//循环从第二个数组元素开始,因为 arr[0]作为最初已排序部分
{
int temp=arr[i];//temp标记为未排序第一个元素
int j=i-;
while (j>= && arr[j]>temp)/*将 temp与已排序元素从小到大比较,寻找 temp应插入的位置*/
{
arr[j+]=arr[j];
j--;
}
arr[j+]=temp;
}
}

最佳效率 O(n );最糟效率 O(n² )与冒泡、选择相同,适用于排序小列表,若列表基本有序,则插入排序比冒泡、选择更有效率。

4、希尔(Shell)排序

基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

void  ShellSortArray1()
{
for(int incr=;incr>;incr--)//增量递减,以增量 3,2 ,1为例
{
for(int L=;L<(n-)/incr;L++)//重复分成的每个子列表
{
for(int i=L+incr;i<n;i+=incr)//对每个子列表应用插入排序
{
int temp=arr[i];
int j=i-incr;
while(j>=&&arr[j]>temp)
{
arr[j+incr]=arr[j];
j-=incr;
}
arr[j+incr]=temp;
}
}
}
} void ShellSortArray2(int *data, int len)
{
int d = len;
while(d > )
{
d = (d+)/;
for(int i=; i<len-d; i++)
{
if(data[i+d] < data[i])
{
int tmp = data[i+d];
data[i+d] = data[i];
data[i] = tmp;
}
}
}
}

适用于排序小列表。 效率估计 O(nlog2^n )~O( n^1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是 的幂,则在下一个通道中会再次比较相同的元素。 壳(Shell)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。

5、归并排序

基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + ;
int m = mid, n = last;
int k = ; while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m) temp[k++] = a[i++];
while (j <= n) temp[k++] = a[j++];
for (i = ; i < k; i++)
a[first + i] = temp[i];
} void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / ;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + , last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
} bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL) return false;
mergesort(a, , n - , p);
delete[] p;
return true;
}

Algorithm --> 十大排序算法的更多相关文章

  1. [ 转载 ] js十大排序算法:冒泡排序

    js十大排序算法:冒泡排序  http://www.cnblogs.com/beli/p/6297741.html

  2. 十大排序算法JavaScript实现总结

    花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...

  3. 十大排序算法总结(Python3实现)

    十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...

  4. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  5. 使用 js 实现十大排序算法: 快速排序

    使用 js 实现十大排序算法: 快速排序 QuickSort 快速排序 /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @c ...

  6. 使用 js 实现十大排序算法: 桶排序

    使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  7. 使用 js 实现十大排序算法: 计数排序

    使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. 使用 js 实现十大排序算法: 基数排序

    使用 js 实现十大排序算法: 基数排序 基数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  9. 使用 js 实现十大排序算法: 冒泡排序

    使用 js 实现十大排序算法: 冒泡排序 冒泡排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

随机推荐

  1. eclipse中maven的run as打war包失败的问题

    场景一: 由于某些原因,有的时候需要暂时在断网的情况下,或者更标准的说,是在连不上公司的maven公有仓库的情况下打包. 很长一段时间,我打包都是在eclipse中用run as在线打包,直到前不久一 ...

  2. dojo API中英文缩写的意思

    dojo API中英文缩写的意思 1.A-Array(数组) 2.B-Boolean(布尔类型) 3.C-Constructor(构造器) 4.D-Date(日期) 5.{}-DomNode(节点) ...

  3. Caused by: java.lang.ClassNotFoundException: org.hibernate.service.jta.platform.spi.JtaPlatform

    1.错误描述 2014-7-12 22:08:01 org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000232: Schema up ...

  4. iOS - Core Animation 核心动画的使用

    1.简单使用示例 1.1 时钟 QClockView.h @interface QClockView : UIView /// 创建时钟界面 + (instancetype)q_clockViewWi ...

  5. dom文档对象模型图

  6. toggle的用法(点击更换不同的function)当指定元素被点击时,在两个或多个函数之间轮流切换。

    一,用法 <html> <head> <script type="text/javascript" src="/jquery/jquery. ...

  7. json数组本地获取,以及根据字段排序【部分摘录】

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. CF484E Sign on Fence

    题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于 ...

  9. 圆方树简介(UOJ30:CF Round #278 Tourists)

    我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个 ...

  10. Poj2749:Building roads

    题意 有 N 个牛栏,现在通过一条通道(s1,s2)要么连到s1,要么连到s2,把他们连起来,他们之间有一些约束关系,一些牛栏不能连在同一个点,一些牛栏必须连在同一个点,现在问有没有可能把他们都连好, ...