冒泡排序是一种比较排序,下面我实现一个从小到大的冒泡排序:
先定义两个变量:
待排序数组:int[] source;
数组长度 length = source.length;
原理如下:
1、开始:有length-1次循环,每次参与循环的是未排序的数。第一次参与循环的是整个数组,因为假设整个数组是无序的。
每次循环需要设置一个标志位: boolean flag = false;表示循环过程中是否产生了交换。
2、过程:循环过程中, 相邻的两个元素进行比较,如果source[j] > source[j+1],则交换两者顺序,同时标志位flag = true;表示产生了交换。每一次循环结束后,最大数沉到未排序部分的尾部,每次循环找出一个最大数。
3、结束:每次循环结束后,如果标志位flag未改变的话,证明未排序的部分中没有source[j] > source[j+1],即未排序部分已经有序,这时,跳出循环,排序结束。
或者length-1次循环结束后,数组有序。
为什么是length-1次而不是length循环,因为每次循环找出一个最大数,沉下去,length-1次循环后,只剩下一个元素,不需要进行任何比较,它就是最小的。
JAVA代码如下:
- package sort;
- import java.util.Scanner;
- public class bubbleSort {
- public void sort(int[] source){
- int length = source.length;
- boolean flag = false;
- for(int i=1;i<=length-1;++i){
- flag = false;
- for(int j=0;j<length-i;++j){
- if(source[j] > source[j+1]){
- int temp = source[j];
- source[j] = source[j+1];
- source[j+1] = temp;
- flag = true;
- }
- }
- if(flag == false)
- break;
- }
- }
- public static void main(String[] args){
- Scanner in = new Scanner(System.in);
- bubbleSort bs = new bubbleSort();
- while(in != null){
- int num = in.nextInt();
- int[] source = new int[num];
- for(int i=0;i<num;++i){
- source[i] = in.nextInt();
- }
- bs.sort(source);
- for(int a:source){
- System.out.print(a+" ");
- }
- System.out.println();
- }
- }
- }