zoukankan      html  css  js  c++  java
  • 交换排序—冒泡排序(Bubble Sort)

    基本思想:

    在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。

    即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

    冒泡排序的示例:

     

    算法的实现:

     
    1. void bubbleSort(int a[], int n){  
    2.     for(int i =0 ; i< n-1; ++i) {  
    3.         for(int j = 0; j < n-i-1; ++j) {  
    4.             if(a[j] > a[j+1])  
    5.             {  
    6.                 int tmp = a[j] ; a[j] = a[j+1] ;  a[j+1] = tmp;  
    7.             }  
    8.         }  
    9.     }  
    10. }  



    冒泡排序算法的改进

    对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。本文再提供以下两种改进算法:

    1.设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

    改进后算法如下:

     
    1. void Bubble_1 ( int r[], int n) {  
    2.     int i= n -1;  //初始时,最后位置保持不变  
    3.     while ( i> 0) {   
    4.         int pos= 0; //每趟开始时,无记录交换  
    5.         for (int j= 0; j< i; j++)  
    6.             if (r[j]> r[j+1]) {  
    7.                 pos= j; //记录交换的位置   
    8.                 int tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;  
    9.             }   
    10.         i= pos; //为下一趟排序作准备  
    11.      }   
    12. }    

    2.传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。

    改进后的算法实现为:

     
    1. void Bubble_2 ( int r[], int n){  
    2.     int low = 0;   
    3.     int high= n -1; //设置变量的初始值  
    4.     int tmp,j;  
    5.     while (low < high) {  
    6.         for (j= low; j< high; ++j) //正向冒泡,找到最大者  
    7.             if (r[j]> r[j+1]) {  
    8.                 tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;  
    9.             }   
    10.         --high;                 //修改high值, 前移一位  
    11.         for ( j=high; j>low; --j) //反向冒泡,找到最小者  
    12.             if (r[j]<r[j-1]) {  
    13.                 tmp = r[j]; r[j]=r[j-1];r[j-1]=tmp;  
    14.             }  
    15.         ++low;                  //修改low值,后移一位  
    16.     }   
    17. }   
  • 相关阅读:
    rpm yum 等命令无响应的解决方法
    ulimit open files linux打开文件数设置验证
    解析XtraBackup备份MySQL的原理和过程(转)
    Xtrabackup之innobackupex备份恢复详解(转)
    Linux中内存查看命令free详解(转)
    mysql innobackupex xtrabackup 大数据量 备份 还原(转)
    Percona Xtrabackup备份mysql(转)
    安装完 MySQL 后必须调整的 10 项配置(转)
    MySQL 5.5 服务器变量详解二(转)
    MySQL 5.5 服务器变量详解一(转)
  • 原文地址:https://www.cnblogs.com/xingzc/p/5801696.html
Copyright © 2011-2022 走看看