转载自:http://blog.csdn.net/wangkuifeng0118/article/details/7286332
http://www.oschina.net/code/snippet_186712_6364
快速排序的基本思想:
通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。时间复杂度:O(nlog2N)
先看一下这幅图:
把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。
package algorithm.base;
public class QSort
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO 自动生成方法存根
quicksort qs = new quicksort();
// int data[] = {44,22,2,32,54,22,88,77,99,11};
int data[] = {44,22,2,32,54,22,88,77,99,44};
qs.data = data;
qs.sort(0, qs.data.length-1);
qs.display();
}
}
class quicksort
{
public int data[];
private int partition(int sortArray[],int low,int high)
{
int key = sortArray[low];
while(low<high)
{
while(low<high && sortArray[high]>=key)
high--;
sortArray[low] = sortArray[high];
while(low<high && sortArray[low]<=key)
low++;
sortArray[high] = sortArray[low];
}
sortArray[low] = key;
return low;
}
public void sort(int low,int high)
{
if(low<high)
{
int result = partition(data,low,high);
sort(low,result-1);
sort(result+1,high);
}
}
public void display()
{
for(int i=0;i<data.length;i++)
{
System.out.print(data[i]);
System.out.print(" ");
}
}
}
时间复杂度:O(nlog2N)