zoukankan      html  css  js  c++  java
  • java:高速排序算法与冒泡排序算法

    

    Java:高速排序算法与冒泡算法

    首先看下,冒泡排序算法与高速排序算法的效率:

    例如以下的是main方法:

    /**
      * 
     * @Description: 
     * @author:cuiyaonan2000@163.com
     * @date 2014年11月5日 下午1:02:10
      */
     public static void main(String[] args) {
      //高速排序算法測试
      int[] qArray = new int[100000];
      for (int i = 0; i < 100000; i++){
       qArray[i] = (int) (Math.random() * 100000);
      }
      long beforeQ = System.currentTimeMillis();
      quickSort(qArray, 0, qArray.length-1);
      System.out.println("高速排序执行时间:" + (System.currentTimeMillis() - beforeQ));
      
      //冒泡排序算法測试
      int[] bArray = new int[100000];
      for (int i = 0; i < 100000; i++){
       bArray[i] = (int) (Math.random() * 100000);
      }
      long beforeB = System.currentTimeMillis();
      bubble(bArray);
      System.out.println("冒泡排序执行时间:" + (System.currentTimeMillis() - beforeB));
     }

    在一个有100000 个数字的数组中排序结果例如以下:


     

     

    例如以下的是大家耳熟能详的冒泡算法(关于冒泡就不多说了):

         

    /**
      * 
     * @Description: 
     * @author:cuiyaonan2000@163.com
     * @date 2014年11月5日 下午1:00:32
      */
     public static void bubble(int[] data) {
      for (int i = 0; i < data.length - 1; i++) {
       for (int j = i + 1; j < data.length; j++)
        if (data[i] > data[j]) {
         int temp = data[j];
         data[j] = data[i];
         data[i] = temp;
        }
      }
     }
    

     

    先说下关于高速排序算法的思路:

    1. 选取数组第一个数字,作为key.并设置变量i0,j为数组长度.

    2. 从数组最后一位開始向前找,找什么呢?找比key小的数字(不能等于),并记录下坐标j.限制条件是,在向前找的过程中假设一直没找到比key小的数值,就在i<j的时候停止(假设没有找到j就做减一操作继续找).假设找到了就将数组[j]与数组[i]的值对换并结束.

    3. 从数组第一位開始向后找,找什么呢?找比key大的数字(不能等于),并记录下坐标i.限制条件是,在向前找的过程中假设一直没找到比key大的数值,就在i<j的时候停止(假设没有找到i就做加一操作继续找).假设找到了就将数组[j]与数组[i]的值对换并结束.

    4. 完毕如上的操作,打印输出数组发现:数据变得相对有序了,就是在数组中key值坐标前面的都是小于key,key值坐标后面的都是大于key值得,

    5. 所以大家明确了:将以key值为坐标的数组拆分成2个数组,分别去运行123步骤操作,终于就会产生一个有序数组


    算法例如以下

    /**
      * 
     * @Description: 
     * @author:cuiyaonan2000@163.com
     * @date 2014年11月5日 下午1:02:45
      */
     public static void quickSort(int[] array,int begin,int end){
      int theKey = array[begin];   //设置关键值
      int i = begin;
      int j = end;
      while(true){
       while(i<j && array[j] >= theKey)   //从后面找到一个比关键之小的数字坐标
        j-- ;
       if(i<j){  //交换
        int temp = array[j];
        array[j] = array[i];
        array[i] = temp;
       }else{
        break;
       }
       while(i<j && array[i] <= theKey)   //从前面找到一个比关键之大的数字坐标
        i++;
       if(i<j){ //交换
        int temp = array[j];
        array[j] = array[i];
        array[i] = temp;
       }else{
        break;
       }
      }
      
      if(--i > begin ){//这个表示一直找到 被拆分的数组中仅仅有一个值.否则递归调用
       quickSort(array,begin,i);
      }
      if(++j< end){ //这个表示一直找到 被拆分的数组中仅仅有一个值.否则递归调用
       quickSort(array,j,end);
      }
     }

     

    
  • 相关阅读:
    对拍
    浅谈trie树
    蒟蒻的二分模板
    浅谈线性素数筛
    浅谈树状数组
    HDU 2181 哈密顿绕行世界问题
    HDU 3567 Eight II
    HDU 1043 Eight
    POJ 3076 Sudoku
    hihoCoder 1087 Hamiltonian Cycle
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4224753.html
Copyright © 2011-2022 走看看