快速排序(一)

转载 2006年06月22日 13:47:00

/**
* <p>Title:快速排序 </p>
* <p>Description:
 * 速排序法(quick sort)是目前所公認最快的排序方法之一(視解題的對象而定),
 * 雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的。
 * 快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇。
 * </p>
* <p>Copyright: Copyright (c) 2006</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class QuickSort {

  public static void print(int[] number) {//打印输入数组内容
    for (int i = 0; i < number.length; i++) {
      System.out.print(number[i] + ",");
    }
    System.out.println("");
  }

  public static void swap(int[] number, int i, int j) {//交换number数组索引i,j处的值
    int tmp;
    tmp = number[i];
    number[i] = number[j];
    number[j] = tmp;
  }
  /**
   * 以左边元素为轴的快速排序
   * 解法:
   * 1.將最左邊的數設定為軸,並記錄其值為 s
   * 廻圈處理:
   * 2.令索引 i 從數列左方往右方找,直到找到大於 s 的數
   * 3.令索引 j 從數列右方往左方找,直到找到小於 s 的數
   * 4.如果 i >= j,則離開迴圈
   * 5.如果 i < j,則交換索引i與j兩處的值
   * 6.將左側的軸與 j 進行交換
   * 7.對軸左邊進行遞迴
   * 8.對軸右邊進行遞迴
   * 透過以下演算法,則軸左邊的值都會小於s,軸右邊的值都會大於s,如此再對軸左右兩邊進行遞迴,就可以對完成排序的目的
   * 例如下面的實例,*表示要交換的數,[]表示軸:
   * [41] 24 76* 11 45 64 21 69 19 36*
   * [41] 24 36 11 45* 64 21 69 19* 76
   * [41] 24 36 11 19 64* 21* 69 45 76
   * [41] 24 36 11 19 21 64 69 45 76
   * 21 24 36 11 19 [41] 64 69 45 76
   * 在上面的例子中,41左邊的值都比它小,而右邊的值都比它大,如此左右再進行遞迴至排序完成。
   *
   * @param number 排序数组
   * @param left  开始索引
   * @param right 结束索引
   */
  public static void sort(int[] number, int left, int right) {
    if (left < right) {
      int s = number[left];
      int i = left;
      int j = right + 1;
      int len = number.length;
      while (true) {
        while (i+1<len && number[++i] < s)// 向右找
          ;
        while (j-1>-1 && number[--j] > s)    // 向左找
          ;
        if (i >= j)
          break;
        swap(number, i, j);
        print(number);
      }
      number[left] = number[j];
      number[j] = s;
      sort(number, left, j - 1); // 對左邊進行遞迴
      sort(number, j + 1, right); // 對右邊進行遞迴
    }
  }
  /**
   * 以中间元素为轴的快速排序
   * 取中間的元素s作比較,同樣的先得右找比s大的索引 i,然後找比s小的索引 j,
   * 只要兩邊的索引還沒有交會,就交換 i 與 j 的元素值,這次不用再進行軸的交換了,因為在尋找交換的過程中
   * ,軸位置的元素也會參與交換的動作,例如:
   * 41 24 76 11 45 64 21 69 19 36
   * 首先left為0,right為9,(left+right)/2 = 4(取整數的商),所以軸為索引4的位置,
   * 比較的元素是45,您往右找比45大的,往左找比45小的進行交換:
   * 41 24 76* 11 [45] 64 21 69 19 *36
   * 41 24 36 11 45* 64 21 69 19* 76
   * 41 24 36 11 19 64* 21* 69 45 76
   * [41 24 36 11 19 21] [64 69 45 76]
   * 完成以上之後,再初別對左邊括號與右邊括號的部份進行遞迴,如此就可以完成排序的目的。
   * @param number
   * @param left
   * @param right
   */
  public static void sort1(int[] number, int left, int right) {
    if(left < right){
      int i = left -1 ;
      int j = right+1;
      int mid  = (left+right)>>>1;
      int s = number[mid];
      int len = number.length;
      while(true){
        while(i+1<len && number[++i] < s)//向右移
          ;
        while(j-1>-1 && number[--j] > s)//向左移
          ;
        if(i>j)
          break;
        swap(number,i,j);
        print(number);
      }
      sort1(number,left,j);
      sort1(number,i,right);
    }
  }
  public static void sort2(int[] number, int left, int right) {

  }
  public static void main(String[] args) {
    int[] number = {
        -6,-1};
    sort1(number, 0, number.length - 1);
  }
}

快速排序(以中间为基准)

/** * 快速排序。 * @param inputs */ public static void quickSort(int[] inputs, Comparator cp) { sort(inpu...
  • iwuyun
  • iwuyun
  • 2017年04月20日 11:05
  • 615

蓝桥杯四6三部排序填空题

标题:三部排序 一般的排序有许多经典算法,如快速排序、希尔排序等。 但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。 比如,对一个整型数...
  • a716121
  • a716121
  • 2016年02月24日 16:38
  • 435

快速排序学习 以数组中间值为轴

public static void main(String[] args) { int[] arrs = {15,13,17,19,6,34,9,55,9,3242,4}; quickSea...
  • a1833255
  • a1833255
  • 2017年11月27日 16:30
  • 80

快速排序的递归实现算法。

输入:先输入进行排序元素的个数,然后依次随机输入(或随机生成)每个数字。 输出:元素排序后的结果。 示例:输入:8 9 1 2 4 8 6 15 8,输出:1 2 4 6 ...
  • qq_32175379
  • qq_32175379
  • 2017年05月01日 21:33
  • 1034

[算法入门]快速排序非递归方法(Java实现),大家一起来找茬啊~

基础总结一下,快速排序的步骤: 1、找到一个key值(就是数组第一个值),先从右到左找,找到一个比它小的值,记录下标。 2、然后从左往右找,找到一个比它大的值,记录下标。 3、交换找到的两个数字...
  • haolvshiqi
  • haolvshiqi
  • 2017年01月09日 17:06
  • 2095

标题:三部排序

一般的排序有许多经典算法,如快速排序、希尔排序等。     但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情 况建立更好的解法。 ...
  • u012814441
  • u012814441
  • 2014年10月24日 19:29
  • 650

蓝桥杯~快速排列

快速排序排序在各种场合经常被用到。 快速排序是十分常用的高效率的算法。其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它。这样,排序...
  • crate_M
  • crate_M
  • 2016年04月15日 11:20
  • 1281

第一次写快速排序算法出现栈溢出和排序错误的问题

从昨天开始看快速排序算法, 自己看了一会明白了快速排序算法的原理,想把它写出来。可是说起来简单做起来难,本应该是很简洁的代码我却怎么也写不对,尤其是快速排序算法有递归调用,很锻炼思维能力。 刚刚按照网...
  • Luan_Jia
  • Luan_Jia
  • 2015年10月27日 23:47
  • 1146

数据结构实验之排序一:一趟快排

数据结构实验之排序一:一趟快排 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定...
  • guoqingshuang
  • guoqingshuang
  • 2015年12月20日 19:01
  • 2406

iOS算法(一)快速排序算法

快速排序是当遇到较大数据时,排序快,高效的方法(公司面试时,基本上会被问到...) 该方法的基本思想是: 1.先从数列中取出一个数作为基准数。 2.分区过程,将比这个数大的数全放到它的右边,小于...
  • m372897500
  • m372897500
  • 2016年05月16日 13:04
  • 2452
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速排序(一)
举报原因:
原因补充:

(最多只允许输入30个字)