冒泡排序及尝试改进

冒泡排序是一种交换排序思想,既两两比较待排序记录的关键字(值),发现两个记录的次序(大小)相反时进行交换,直到所有记录都满足排序要求。

该算法的平均时间复杂度为O(n2),冒泡排序算法时有几个可以缩短操作的方法:

  1. 如果一次排序比较过程中没有发生记录位置交换,即可停止排序操作;
  2. 如果一次排序比较过程中发生了记录位置交换,则最后一次记录交换的位置,可作为下一次排序比较遍历的停止位置,因为该位置之前的数据都是有序的;
  3. 冒泡排序具有不对称性,比如进行从小到大排序,当原序列最大数排在首位,尽管剩余数已经按照从小到大排序了,比如10,1,2,3,4,6,7,8,9。则排序时从底往前扫描冒泡最小值时,该序列还需要进行9次排序比较,但从前往后进行最大值冒泡时,只需1次排序比较。对数列进行冒泡排序时,分别轮流从前、后分别进行排序比较时,能有效规避不对称性。

基于以上3点分析,下面是优化的冒泡排序算法:

void BubbleSort(int R[],int n)

{ //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序

int i,j,lastchghd,lastchghdpos,lastchgtail,lastchgtailpos;

int bswap;

lastchghdpos = 1;

lastchgtailpos = n-1;

for(i= 1; i< n; i++){

bswap=0;

lastchghd  = lastchghdpos;

lastchgtail = lastchgtailpos;

if (i & 1){ //奇数时,小值冒泡到头部

for(j= lastchgtail; j>= lastchghd; j--) {

if(R[j+1] < R[j]){//交换记录

R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元

R[j+1]=R[j];

R[j]=R[0];

bswap= 1;//发生了交换,故将交换标志置为

lastchghdpos = j;

}

}

}

else{ //偶数时,大值冒泡到底部

for(j= lastchghd; j <= lastchgtail; j++) {

if(R[j+1] < R[j]){//交换记录

R[0]=R[j+1]; //R[0]做暂存单元

R[j+1]=R[j];

R[j]=R[0];

bswap= 1;//发生了交换,故将交换标志置为

lastchgtailpos = j;

}

}

}

if(!bswap) //本趟排序未发生交换,提前终止算法

return;

}

}

时间: 2024-10-11 09:00:41

冒泡排序及尝试改进的相关文章

数据结构之--冒泡排序算法及改进

冒泡排序,是我们学习数据结构第一个排序算法,也是一种最常见和简单的排序算法. 排序原理: 我们把一个数组从左到右依次两两元素比较,比较完成一趟后,能确定最大(最小)值,放在最右边(最左边): 剩下的元素重复上述步骤,直到整个数组有序. 该算法时间复杂度一般为n2  . java实现代码如下: public class BubbleSort { public static void swap(int[] array, int a, int b) { array[a] = array[a] ^ ar

冒泡排序的终极改进优化

1.排序方法 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡.根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮".如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止. (1)初始    R[1..n]为无序区. (2)第一趟扫描    从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下.重者在上,则交换二者的位置.即依次比较(R[n],R[n-1]),(R[n-1],R[

(转载)排序一 冒泡排序

排序一 冒泡排序 目录 要点 算法思想 算法分析 冒泡排序算法的性能 时间复杂度 算法稳定性 优化 完整参考代码 JAVA版本 要点 冒泡排序是一种交换排序. 什么是交换排序呢? 交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止. 算法思想 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越小的元素会经由交换慢慢"浮&q

必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序

冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序的示例: 冒泡排序的算法实现如下:[排序后,数组从小到大排列] /** * 冒泡排序 * 比较相邻的元素.如果第一个比第二个大,就交换他们两个. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一

交换排序—冒泡排序(Bubble Sort)

基本思想: 最简单的排序,也是最耗时间的排序 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 冒泡排序的示例: 算法的实现: void bubbleSort(int a[], int n){ for(int i =0 ; i< n-1; ++i) { for(int j = 0; j < n-i-1; ++j) { if(a[j] > a

交换排序—冒泡排序(Bubble Sort)算法原理以及Java实现

基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 冒泡排序的示例: 算法实现 1 /** 2 * 3 * @author zhangtao 4 */ 5 public class BubbleSort 6 { 7 public static void main(String[] args) 8 { 9 int arr[]={3,1,5,

排序一 冒泡排序

要点 冒泡排序是一种交换排序. 什么是交换排序呢? 交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止. 算法思想 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名. 图-冒泡排序示例图 冒泡排序算法的执行步骤如下:(从后往前) 1.比较相邻的元素.如果第一个比第二个大,就交

排序算法(I)冒泡排序

冒泡排序(Bubble Sort),它重复地走访过要排序的元素,依次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成.这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢"浮"到数列的顶端 冒泡排序算法的运作如下: 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数 针对所有的元素重复以上的步骤,除了最后一个 持续每次对越来越少的元素重复上

排序算法冒泡排序

冒泡排序(Bubble Sort),它重复地走访过要排序的元素,依次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换, 排序完成.这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢"浮"到数列的顶端 冒泡排序算法的运作如下: 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数 针对所有的元素重复以上的步骤,除了最后一个 持续每次对越来越少的元素重复