快速排序

转自 http://blog.csdn.net/pigli/article/details/5747218

基本原理:通过一趟排序将记录分割成两个部分。其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两个部分记录继续进行排序,以达到整个序列有序。


如何分割?
有n个关键字的数列待排列,将第一个元素定为枢纽pivotkey;将数列中其它关键字和pivotkey进行比较,大于pivotkey的放置在pivotkey的后面,小于pivotkey的放置在pivotkey的前面。这就是一趟排序的过程,将一个数列分割成了两个部分,其中pivotkey的前面记录的关键字均比pivotkey的后面的记录的关键字小。然后,就对这两个部分分别继续进行上述这样的排序。(从这个思路就可以预言:这个算法将会用到递归实现)


一趟快速排序具体实现方案?
附设两个指针low和high,它们的初值分别为low和high,设枢纽记录的关键字为pivotkey,则首先从High所指向的位置向前搜索找到第一个关键字小于pivotkey的记录和枢纽记录进行交换,然后从low所指向的位置向后搜索,找到第一个关键字大于pivotkey的记录个枢纽进行交换,重复这两个步骤直至low==high为止。


具体实现如下:

 

[c-sharp] view plaincopy
 
  1. package Sort;  
  2. /* 
  3.  * 快速排序:就平均时间而言,快速排序是目前被认为最好的一种内部排序方法。 
  4.  * 首先将待排序列分成两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后对这两个部分记录继续进行排序,以达到整个序列有序。 
  5.  */  
  6. public class QuickSort {  
  7.     private int[] data ;  
  8.       
  9.     public QuickSort(int[] data)  
  10.     {  
  11.         this.data = data;  
  12.     }  
  13.       
  14.     public void quickSort()  
  15.     {  
  16.         quickSort(0,data.length-1);  
  17.     }  
  18.       
  19.     private void quickSort(int low,int high)  
  20.     {  
  21.         if(low>=high)  
  22.         {  
  23.             return;  
  24.         }  
  25.         int pos = low;  
  26.         int low_current = low;  
  27.         int high_current = high;  
  28.         while(low_current<high_current)  
  29.         {  
  30.             while(low_current<high_current&&data[high_current]>=data[pos])   //注意在内循环中,外循环的条件仍需判断。因为外循环的判断条件在内循环中有改变。  
  31.             {  
  32.                 high_current--;  
  33.             }  
  34.             if(low_current<high_current)  
  35.             {  
  36.                 int tmp_1 = data[pos];  
  37.                 data[pos] = data[high_current];  
  38.                 data[high_current] = tmp_1;  
  39.                 pos = high_current;  
  40.             }  
  41.             while(low_current<high_current&&data[low_current]<=data[pos])  
  42.             {  
  43.                 low_current++;  
  44.             }  
  45.             if(low_current<high_current)  
  46.             {  
  47.                 int tmp_2 = data[pos];  
  48.                 data[pos] = data[low_current];  
  49.                 data[low_current] = tmp_2;  
  50.                 pos = low_current;  
  51.             }  
  52.         }  
  53.         quickSort(low,pos-1);  
  54.         quickSort(pos+1,high);  
  55.     }  
  56.       
  57.     public void ptint()  
  58.     {  
  59.         for(int i=0;i<data.length;i++)  
  60.         {  
  61.             System.out.print(data[i]+"      ");  
  62.         }  
  63.     }  
  64.       
  65.     public static void main(String args[])  
  66.     {  
  67.         int[] array = {49,38,65,97,76,13,27,49,55,4};  
  68.         QuickSort quicksortList = new QuickSort(array);  
  69.         quicksortList.quickSort();  
  70.         quicksortList.ptint();  
  71.     }  

 

 

就平均时间而言,快速排序是目前被认为是最好的一种内部排序方法。快速排序的平均时间为Tavg(n)=kn ln(n).

posted @ 2014-06-13 02:12  princessd8251  阅读(138)  评论(0)    收藏  举报