基础排序算法(1)

1.冒泡排序(Bubble Sort)

冒泡排序是一种基础排序算法,通过循环遍历待排序数组,相邻元素两两比较,按升序或降序的方式选择交换。直到没有相邻元素需要交换,该元素数组已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

冒泡排序算法原理:

Step 1: 比较相邻两个元素,如果第一个比第二个大,就交换两个的位置。

Step 2: 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。(假使数组长度为n,第一步我们对相邻元素比较交换,即较大的数往后移一个位) 

Step 3: 重复一二步,直到数组有序。(从第一个到第n个有(n-1)对相邻元素,第一次遍历n-1对,然后递减直到第n-1个元素。整个循环共比较了(n-1)!对。)

伪代码实现:

1. unsorted array A[]

2. len <- length(A)

3. for(i =0 ;i<len-1;i++){

  for(j = 0;j<len-1-i;j++){//由于后面相邻元素在上一轮已经比较过了,所以j<len-1-i

      if(A[j]>A[j+1]){

     tmp <- A[j];

    A[j]  <-A[j+1];

    A[j+1]<-tmp;

     }

      }

  }

算法分析:

1.假使数组是正序的,比较次数为n-1,交换次数为0,最好的时间复杂度是O(n) 

2.如果数组是反序的,每轮比较次数为(n-i)次,总的比较次数为  ∑(n-i)=n(n-1)/2次,每次比较都必须移动记录三次来达到交换记录位置,所以最坏时间复杂度O(n²).

 

算法稳定性:

 

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
 
java 代码实现:
public class BubbleSort {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //生成随机数
  Scanner sc = new Scanner(System.in);
  System.out.println("请输入生成随机数个数:");
  int n = sc.nextInt();
  int randNum[] = new int[n];
  
  for(int i=0;i<n;i++) {
   int tmp = (int)(Math.random()*10);
   randNum[i] = tmp;
   System.out.print(randNum[i]+" ");
  }
  sc.close();
  System.out.println(" ");
  
  //冒泡排序
  for(int i=0;i<randNum.length-1;i++) {
   for(int j=0;j<randNum.length-1-i;j++) {
    if(randNum[j]>randNum[j+1]) {
     int tmp = randNum[j];
     randNum[j] = randNum[j+1];
     randNum[j+1] = tmp;
    }
   }
  }
  
  for(int i=0;i<randNum.length;i++) {
   System.out.print(randNum[i]+" ");
  }
  
 }
}

 

posted @ 2019-08-13 10:27  binhuang01  阅读(143)  评论(0)    收藏  举报