设为首页 收藏本站
查看: 1055|回复: 0

[经验分享] 经常使用排序算法实现[交换排序之冒泡排序、高速排序]

[复制链接]

尚未签到

发表于 2017-7-4 16:44:12 | 显示全部楼层 |阅读模式
  相关知识

1. 稳定排序和非稳定排序:

稳定排序算法会按照相等的关键(换言之就是值)维持纪录的相对次序。

假设排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出如今S之前,在排序过的列表中R也将会是在S之前。
  

2. 内排序和外排序

在排序过程中,全部须要排序的数都在内存。并在内存中调整它们的存储顺序。称为内排序。

在排序过程中,仅仅有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

3.算法分类

排序算法从理论上分为例如以下几类:

(1) 交换排序法: 冒泡排序高速排序

(2) 选择排序法: 选择排序堆排序、循环排序等

(3) 插入排序法: 插入排序希尔排序、二叉查找树排序等

(4) 归并排序法: 归并排序、Strand排序等

(5) 分布排序法: 基数排序、桶排序、计数排序等。

(6) 混合排序法: 反移排序、Tim排序等

以下主要针对常见的排序算法进行分析
  一:冒泡排序

算法思想:两两比較待排序记录的keyword,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

                    能够分为“大数沉底法”和“小数上浮法”两种不同的形式。
  

时间复杂度:O(n^2)

稳定性:        稳定排序

算法实现:

(1)大数沉底法

void bubble_sort(int array[], int n)
{
int i, j, temp;
for(i = 0; i < n-1; i++)
{
for(j = 0; j < n -i; j++)
{
if(array[j] > array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
  (2)小数上浮法

void bubble_sort(int array[], int n)
{
int i, j, temp;
for(i = 0; i < n-1; i++)
{
for(j = n - 1; j > i; j--)
{
if(array[j] < array[j-1])
{
temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
}
}
}
}
  (3)改进算法
  若在某一趟排序中未发现有位置的交换。则说明待排序的无序区均满足轻者在上,重者在下的原则,因此。冒泡排序过程可在此趟排序后终止。
  因此,改进的算法中,引入一个布尔量exchange。在每趟排序開始前。先将其置为0。若排序过程中发生了交换,则将其置为1。
  各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。

//array[0 .. n-1]是待排序的文件,採用自上向下扫描。对array做冒泡排序
void bubble_sort(int array[], int n)
{
int i, j, temp;
int exchange = 0; //交换标志
for(i = 0; i < n-1; i++) //最多做n-1趟排序
{
exchange = 0; //本趟排序開始前,交换标志应为假
for(j = 0; j < n - i; j++) //对当前无序区array[0 .. n-i]自上向下扫描
{
if(array[j] > array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
exchange = 1;  //发生了交换。故将交换标志置为真
}
}
if(!exchange) //本趟排序未发生交换。提前终止算法
return;
}
}
  二:高速排序

算法思想:通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序。整个排序过程能够递归进行,以此达到整个数据变成有序序列。

时间复杂度:O(nlog2n)

稳定性:        不稳定排序

算法实现:

void quick_sort(int s[], int low, int high)
{
if (low < high)
{
int i = low, j = high, x = s[low];
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;  
if(i < j)
s[i++] = s[j];
while(i < j && s < x) // 从左向右找第一个大于等于x的数
i++;  
if(i < j)
s[j--] = s;
}
s = x;  /*一遍扫描完后,放到适当位置*/  
quick_sort(s, low, i - 1);  /*对基准点左边的数再运行高速排序*/  
quick_sort(s, i + 1, high); /*对基准点右边的数再运行高速排序*/  
}
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390742-1-1.html 上篇帖子: 学习RabbitMQ(三):AMQP事务机制 下篇帖子: AMQP与RabbitMQ简介
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表