快速排序
转自 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为止。
具体实现如下:
- package Sort;
- /*
- * 快速排序:就平均时间而言,快速排序是目前被认为最好的一种内部排序方法。
- * 首先将待排序列分成两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后对这两个部分记录继续进行排序,以达到整个序列有序。
- */
- public class QuickSort {
- private int[] data ;
- public QuickSort(int[] data)
- {
- this.data = data;
- }
- public void quickSort()
- {
- quickSort(0,data.length-1);
- }
- private void quickSort(int low,int high)
- {
- if(low>=high)
- {
- return;
- }
- int pos = low;
- int low_current = low;
- int high_current = high;
- while(low_current<high_current)
- {
- while(low_current<high_current&&data[high_current]>=data[pos]) //注意在内循环中,外循环的条件仍需判断。因为外循环的判断条件在内循环中有改变。
- {
- high_current--;
- }
- if(low_current<high_current)
- {
- int tmp_1 = data[pos];
- data[pos] = data[high_current];
- data[high_current] = tmp_1;
- pos = high_current;
- }
- while(low_current<high_current&&data[low_current]<=data[pos])
- {
- low_current++;
- }
- if(low_current<high_current)
- {
- int tmp_2 = data[pos];
- data[pos] = data[low_current];
- data[low_current] = tmp_2;
- pos = low_current;
- }
- }
- quickSort(low,pos-1);
- quickSort(pos+1,high);
- }
- public void ptint()
- {
- for(int i=0;i<data.length;i++)
- {
- System.out.print(data[i]+" ");
- }
- }
- public static void main(String args[])
- {
- int[] array = {49,38,65,97,76,13,27,49,55,4};
- QuickSort quicksortList = new QuickSort(array);
- quicksortList.quickSort();
- quicksortList.ptint();
- }
就平均时间而言,快速排序是目前被认为是最好的一种内部排序方法。快速排序的平均时间为Tavg(n)=kn ln(n).
小小菜鸟一枚
浙公网安备 33010602011771号