十大排序算法

主要排序法有:  
一、冒泡( 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. dojo中的xhrPost请求(JSON)

    dojo中的xhrPost请求 dojo.xhrPost({ url:"../area.action", content:{ areaCode:areaCode }, handle ...

  2. 【linux】mysql安装问题 g++: not found

    问题现象: ../depcomp: line 512: exec: g++: not foundmake[2]: *** [my_new.o] Error 127make[2]: Leaving di ...

  3. 电脑开机后,就会自动运行chkdsk,我想取消chkdsk,怎么取消

     每次开机都自动检查磁盘,检测通过后下次还是一样,NTFS/FAT32分区都有可能有这样的情况,即使重装系统,仍可能出现同样情况,但是硬盘可以通过Dell 随机带的检测程序解决方法:在命令行窗口中 ...

  4. No bean named 'sessionFactory' is defined

    1.错误描述 严重:Servlet service() for servlet default threw exception . org.springframework.beans.factory. ...

  5. Java中对整数格式化

    Java中对整数格式化 1.说明    对整数进行格式化:%[index$][标识][最小宽度]转换方式 2.实例分析 (1)源码 /** * 1. 对整数进行格式化:%[index$][标识][最小 ...

  6. 2.3 InnoDB 体系架构

    下图简单显示了InnoDB的存储引擎的体系架构,从图可见,InnoDB储存引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构 缓存磁 ...

  7. docker进阶-搭建私有企业级镜像仓库Harbor

    为什么要搭建私有镜像仓库   对于一个刚刚接触Docker的人来说,官方的Docker hub是用于管理公共镜像.既然官方提供了镜像仓库我们为什么还要去自己搭建私有仓库呢?虽然也可以托管私有镜像.我们 ...

  8. mysql5.6版本备份报错

    MySQL5.6版本备份报错,密码不安全 [root@centos199 mysql]# mysqldump -uroot -ppassword cz-office > mysql38.sqlW ...

  9. c++ STL容器适配器

    一.标准库顺序容器适配器的种类     标准库提供了三种顺序容器适配器:queue(FIFO队列).priority_queue(优先级队列).stack(栈)   二.什么是容器适配器     &q ...

  10. 如何解决Reporting Services目录数据库文件存在的问题

    打开MSSQL数据库管理系统的安装目录,例如:C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA,C:\是你 ...