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