冒牌排序及其优化(鸡尾酒排序)

编程入门 行业动态 更新时间:2024-10-20 16:02:09

<a href=https://www.elefans.com/category/jswz/34/161568.html style=冒牌排序及其优化(鸡尾酒排序)"/>

冒牌排序及其优化(鸡尾酒排序)

 

关于冒牌排序及其几种优化:



初学c语言我们就知道冒泡排序这种东西,虽然冒泡排序的运行效率并不高,但是并不妨碍我们写这种排序的热情,因为好写鸭!
首先是我们的主程序部分,用time函数获取随机数并赋值.不同的童鞋可以去看看rand()与time()的介绍.
 

#include<stdio.h>
#include<time.h>
#include<stdlib.h> 
#define max 100000 //10000int main () {int arr[max];srand((unsigned)time(NULL));for(int i = 0;i < max;i++) {int temp = rand() % 100000;arr[i] = temp;} return 0;
} 

我们本次研究的主要是10000与30000数目的数组排序的时间比较.


第一种是最经典的冒泡排序:

for(int i = 0;i < max - 1 ;i++) { //N = 30000 s=4 N = 10000 s = 0.69for(int j = 0;j < max - 1;j++) {if(arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}


多次试验,在N=10000时,平均排序时间为0.98s,在N=30000时,排序时间为40s.

第二种是简单对排序次数进行的优化
利用flag进行标记,在某次不需排序的循环中退出

    for(int i = 0;i < max - 1;i++) { //N = 30000 s = 4 N = 10000 s = 0.69int flag = 1;for(int j = 0;j < max - 1;j++) {if(arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;flag = 0;}}if(flag) {break;}}


多次试验,这种优化效果并不明显,在N=10000时甚至效果不如普通冒泡排序,不建议使用.

第三种,鸡尾酒排序!!(敲黑板,划重点)
第三种鸡尾酒排序又称为来回排序,保持冒泡排序的特性不变,在每次循环进行两次移位:

 int left = 0;int right = max - 1;while(left < right) { //N = 10000 s = 0.26 N = 30000 s = 2.2for(int j = left;j < right;j++) {if(arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}right--;for(int j = right;j > left;j--) {if(arr[j] < arr[j - 1]) {int temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;}}left++;}


多次试验,在N=30000时,优化效果显著提升,在N=10000时也有效果.
 

 

更多推荐

冒牌排序及其优化(鸡尾酒排序)

本文发布于:2023-07-28 17:54:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1268363.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:冒牌   鸡尾酒

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!