排序-冒泡排序

来源:互联网 发布:开发程序员 编辑:程序博客网 时间:2024/06/07 02:32

   冒泡排序(BubbleSort)的基本概念

        依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。[2]

     不断的循环的从第1个 和2、3、.... 开始比较。把比较的结果中 最小的放到第一位;

                         把第2个和3、4......开始比较。把比较的结果中 最小的放到第二位;

  ...........


Java参考代码:

public class Bubble {public final static int[] score = { 23, 36, 12, 89, 56,32 };public static void main(String[] args) {//原数据for (int i = 0; i < score.length; i++) {System.out.print(score[i] + " ");}System.out.println();    bubble2(score);//排序之后的数据for (int i = 0; i < score.length; i++) {System.out.print(score[i] + " ");}}/** * 冒泡排序 *  不断的循环的从第1个 和2、3、.... 开始比较。把比较的结果中 最小的放到第一位;                         把第2个和3、4......开始比较。把比较的结果中 最小的放到第二位;  ........... * @param a2 * @return */private static int[] bubble(int[] a) {int temp;// 目标 通过不断的比较把最小的数字放到前面for (int i = 0; i < a.length; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j] < a[i]) {temp = a[j];a[j] = a[i];a[i] = temp;}}}return a;}/** *  冒泡排序 *  从最后一个开始不断的比较最小的一个,将其排到前面的位置 * @param a * @return */private static int[] bubble2(int[] a) {int temp,count=a.length;// 目标 通过不断的比较把最小的数字放到前面for (int i = 0; i < count; i++) {for (int j = count-1; j >i; j--) {System.out.println(j);if (a[j]<a[j-1]) {temp = a[j];a[j] = a[j-1];a[j-1] = temp;}}}return a;}}

C语言相关代码[1]:

#include <stdio.h>#include<time.h> #define ARRAYLEN 6#include <stdlib.h>int CreateData(int arr[],int n,int min,int max) //创建一个随机数组,a保存生成的数据,n为数组元素的数量 {    int i,j,flag;    srand(time(NULL));    if((max-min+1)<n) return 0; //最大数与最小数之差小于产生数组的数量,生成数据不成功     for(i=0;i<n;i++)    {        do        {            arr[i]=(max-min+1)*rand()/(RAND_MAX+1)+min;            flag=0;            for(j=0;j<i;j++)            {                if(arr[i]==arr[j])                    flag=1;            }        }while(flag);            }    return 1;}void BubbleSort(int a[],int n){    int i,j,t;    for(i=0;i<n-1;i++)    {        for(j=n-1; j>i; j--)        {            if(a[j-1]>a[j])            {printf("%d \n",j);                t=a[j-1];                a[j-1]=a[j];                a[j]=t;            }        }        printf("第%2d遍:",i+1);         for(j=0;j<n;j++)            printf("%d ",a[j]);        printf("\n");    }}void BubbleSort1(int a[],int n){    int i,j,t,flag=0;        //flag用来标记是否发生交换    for(i=0;i<n-1;i++)    {        for(j=n-1;j>i;j--)        {            if(a[j-1]>a[j])//交换数据             {                t=a[j-1];                a[j-1]=a[j];                a[j]=t;                flag=1;            }        }        printf("第%2d遍:",i+1);         for(j=0;j<n;j++)            printf("%d ",a[j]);        printf("\n");        if(flag==0)    //没发生交换,直接跳出循环            break;        else            flag=0;    }}int main(){    int i,a[ARRAYLEN];    for(i=0;i<ARRAYLEN;i++)        a[i]=0;    if(!CreateData(a,ARRAYLEN,1,100))    {        printf("生成随机数不成功!\n");        getch();        return 1;    }    printf("原数据:");     for(i=0;i<ARRAYLEN;i++)        printf("%d ",a[i]);    printf("\n");    BubbleSort(a,ARRAYLEN);    printf("排序后:");     for(i=0;i<ARRAYLEN;i++)        printf("%d ",a[i]);    printf("\n");    getch();    return 0;   }




相关资料:

[1]零基础学算法(第2版)
[2]http://baike.baidu.com/view/254413.htm