冒泡排序、快速排序示例

冒泡排序的核心部分事双重嵌套循环,不难看出时间复杂度为O(N^2),这是一个非常高的时间复杂度。
原理很简单,直接看代码:
import  java.util.Scanner;

public  class  MaopaoPaixu {

      public  static  void  main(String[] args) {
           Scanner cin =  new  Scanner(System.  in );
             int  n = cin.nextInt();
             int  i , j ,temp;
             int  array[] =  new  int [n];
             for  (i = 0; i < n; i++) {
                array[i] = cin.nextInt();
           }
           cin.close();
             //冒泡排序核心代码
             for  ( i = 0; i < n-1; i++) {                 //冒泡n-1趟,n为排序数组的元素个数
                  for  (j = 0;  j < n-1-i; j++) {         //j第一趟从第一个元素到倒数第二个元素
                       if (array[j]>array[j+1]){
                           temp = array[j];
                           array[j] = array[j+1];
                           array[j+1] = temp;
                     }
                }
           }
             for  (i = 0;  i< n; i++) {
                System.  out .print(array[i]+  " " );
           }
     }
}


快速排序是最常用的排序,每一轮处理就是选定一个基准数,让比它小的数字放在左边,比它大的数字放在其右边,直到所有的数都归位,排序就结束了。


快速排序之所以比冒泡排序快,是因为每次交换都是跳跃式的,每次排序的时候设置一个基准点,小于等于基准点的数全部放在基准点的左边,将大于等于基准点的数全部放到基准点的右边,这样在每次交换的时候就不会冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因为总的比较和交换次数变少了,速度自然就提高了。当然,在最坏的情况下,仍然可能是相邻的两个数进行交换,因此快速排序的最差时间复杂度是和冒泡排序是一样的,都是O(N^2),它的平均时间复杂度为O(NlogN)。


Java程序代码,亲测

import  java.util.Scanner;

public  class  KuaisuPaixu {
      static  int  a [] =  new  int [101];                         //定义全局变量,这两个变量需要在子函数中使用
      static  int  n ;

      public  static  void  main(String[] args) {
             int  i;
           Scanner cin =  new  Scanner(System.  in );
             n  = cin.nextInt();
             for  (i = 0; i <  n ; i++) {
                  a [i] = cin.nextInt();                        //输入数组长度和数组
           }
           cin.close();
           
            quicksort(0, n -1);                                            //快速排序调用
           
             for  (i = 0; i <  n ; i++) {
                System.  out .print(  a [i]+  " " );                  //输出结果
           }
     }
     
      public  static  void  quicksort(  int  left,  int  right){
             int  i,j,t,temp;
             if (left > right)
                  return  ;
           
           temp =  a [left];                                        //temp中存的就是基准数
           i = left;
           j = right;
             while (i != j){                                       
                  while (  a [j] >= temp && i < j)                 //顺序很重要,先从右往左找
                     j--;
                  while (  a [i] <= temp && i < j)                 //从左往右找
                     i++;
                  if (i < j){                                        //交换连个数在数组中的位置,i<j代表哨兵i和哨兵j没有相遇
                     t =  a [i];
                       a [i] =  a [j];
                       a [j] = t;
                }
           }
           
             a [left] =  a [i];                                        //基准数归位
             a [i] = temp;
           
            quicksort(left,i-1);                              //递归处理左边的数
            quicksort(i+1,right);                             //递归处理右边的数
     }
}

示例题:
学校要建立一个图书角,小哼让每个同学写出一个自己最想读的书的ISBN号(每本书都有唯一的ISBN号),有一些好书会有很多同学喜欢,这样就会收集到很多重复的ISBN号,小哼药去掉重复的ISBN号,每个ISBN号只能保留一个,也就是说同样的书只卖一本。然后再把这些ISBN号从小到大排序,小哼讲按照排序号的ISBN号去书店买书。请你协助小哼完成“去重”和“排序”。
输入有2行,第一行为一个正整数,表示有n个同学参与调查(n<=100),第二行有n个空格隔开的正整数,为每本图书的ISBN号(假设图书的IBSN号在1~1000)。

输出有2行,第一行为一个正整数k,表示需要买多少本书,第二行为k个用空格隔开的正整数,为从小到大已排好序的需要购买的图书的IBSN号。

例如输入:
10
20 40 32 67 40 20 89 300 400 15

输出:
8
15 20 32 40 67 89 300 400


第一种方法:
先将n个图书的ISBN号去重。再进行从小到大的排序;可以借助桶排序解决此问题
Java代码如下:

import  java.util.Scanner;

public  class  exampleBuyBooks {

      public  static  void  main(String[] args) {
           Scanner cin =  new  Scanner(System.  in );
             int  n = cin.nextInt();
             int  a[] =  new  int [1001];                          //初始化桶
             int  t, j=0;
             for  (  int  i = 0; i < n; i++) {
                t=cin.nextInt();
                  if (a[t]==0){
                     a[t] = 1;                                   //标记桶,桶号对应ISBN号
                     j++;                                        //j表示有多少个桶被标记,即去重后的书本数
                }
           }
           cin.close();
           System.  out .println(j);
             for  (  int  i = 0; i < 1001; i++) {
                  if (a[i]==1)                                             //将被标记的桶打印出来
                     System.  out .print(i+  " " );
           }
     }

}



第二种方法:先排序再去重

import  java.util.Scanner;

//第二种方法:先排序再去重
public  class  exampleBuyBooks2 {

      public  static  void  main(String[] args) {
           Scanner cin =  new  Scanner(System.  in );
             int  n = cin. nextInt();
             int  temp,k=1;
             int  a[] =  new  int [101];
             for  (  int  i = 0; i < n; i++) {
                a[i] = cin.nextInt();
           }
           cin.close();
             //使用冒泡排序
             for  (  int  i = 0; i < n; i++) {
                  for  (  int  j = 0; j < n-1-i; j++) {
                       if (a[j] > a[j+1]){
                           temp = a[j];
                           a[j] = a[j+1];
                           a[j+1] = temp;
                     }
                }
           }
           
           
             //输出ISBN号,去重
             for  (  int  i = 1; i < n; i++) {
                  if (a[i] != a[i-1])
                     k++;                                                      //k代表去重后的书本数
           }
           System.  out .println(k);
           System.  out .print(a[0]+  " " );
             for  (  int  i = 1; i < n; i++) {
                  if (a[i] != a[i-1])                                    //i从1开始否则i-1会出现数组越界异常
                      System.  out .print(a[i]+  " " );
           }
     }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值