现在的位置: 首页 > 综合 > 正文

排序-冒泡排序

2013年08月15日 ⁄ 综合 ⁄ 共 2507字 ⁄ 字号 评论关闭

   冒泡排序(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

抱歉!评论已关闭.