冒泡排序的优化算法
2012-08-29 21:49
211 查看
/* *减少了冒泡排序外面的循环的次数,如果在第K项后没有产生交换, *则K项之后所有的项必定有序,如果k=0则说明整个数组都有序,则退出 */ int* sort(int a[],int length) { int k=length-1,j,kk,temp; //k为最后一次调换的位置,kk为临时计数器 while(k>0) { kk=0; for(j=0;j<k;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; kk=j; } } k=kk; } return a; } /* *排序是在程序设计中常碰到的问题,排序算法也有很多种。起泡法是众所周知的排序算法, *其原理是每次将相邻两个数进行比较,较大的下沉。其的主程序段如下(用VC++实现): */ Void Bubble Sort (int* pData,int Count) { Int iTemp; for(int i=1;i<Count;i++) { For (int j=Count-1;j>=i;j--) { if(pData[j]<pData[j-1]) { iTemp = pData[j-1]; pData[j-1] = pData[j]; pData[j] = iTemp; } } } } /* *我们分析上述程序段可以发现起泡法是从一端开始比较的,第一次循环就是把最小数上升到第一位置, *第二次循环就是把第二最小数上升到第二位置。如此循环实现数据的排序。 *那么我们是否可以找到最小数的同时找到最大数呢?当然可以。 *方法是在一端起泡时同时在另一端也进行起泡。即反向起泡。下面的程序段实现的是双向起泡: */ void Bubble2Sort(int* pData,int Count) { int iTemp; int left = 1; int right =Count -1; int t; do { //正向的部分 for(int i=right;i>=left;i--) { if(pData[i]<pData[i-1]) { iTemp = pData[i]; pData[i] = pData[i-1]; pData[i-1] = iTemp; t = i; } } left = t+1; //反向的部分 for(i=left;i<right+1;i++) { if(pData[i]<pData[i-1]) { iTemp = pData[i]; pData[i] = pData[i-1]; pData[i-1] = iTemp; t = i; } } right = t-1; }while(left<=right); } /* *分析上面的程序段我们可以发现正向起泡时第一次循环找出了最小数,反向起泡第一次循环找到最大数。 *很显然在一次循环中即可以找到一个最小的数还可以找到一个最大的数, *所以用双向冒泡排序的交换的次数减少了,从而达到了优化起泡法的作用。 */
相关文章推荐
- 冒泡排序实现及算法优化(java)
- 排序算法-对冒泡排序的优化改进算法
- 算法——排序之冒泡排序优化
- 【算法1】之冒泡排序极其优化
- 冒泡排序及算法优化
- 经典算法之二:冒泡排序及优化
- 校招算法之冒泡排序的优化
- ios之经典算法冒泡排序以及优化
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 【算法导论-006】冒泡排序及其优化(BubbleSort)
- 看数据结构写代码(2) 选择排序 和 冒泡排序 算法优化
- 《大话数据结构》读书笔记之冒泡排序和源码及优化算法源码
- *冒泡排序及其算法优化分析
- 【深度学习】优化算法(未完成)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 传统优化算法与遗传算法之间的优缺点和特点比较
- 算法 ----- 排序lowB三人组 冒泡排序 选择排序 插入排序
- 实用优化算法(一)准备和概念
- 白话经典算法系列之一 冒泡排序的三种实现