/**
* 1.2 快速排序: 首先任意选取一个数据(通常选第一个)作为关键数据,
* 然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,
* 即确定该数的最终位置,该数两边为两个区间,在它们中各找一个关键
* 数据继续进行前面的操作,直到所有区间都只有一个数为止,表示所有数
* 的最终位置都被确定
*
* 一趟快速排序的算法是:
* 1)设置两个变量i,j,排序开始的时候:i=0,j=N-1;
* 2)以第一个数组元素作为关键数据,赋值给key,即key=nums[0];
* 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值nums[j],将nums[j]和nums[i](key)互换;
* 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的nums[i],将nums[i]和nums[j](key)互换;
* ......
* 5)当i=j时,该轮排序结束,此时i,j都指向key,key所在的位置i或j即为分割点.
*
* EX: int[] nums={8(key),1,4,2,23,10}; <
*
* 8(key),1,4,2,23,10
* 2,1,4,8(key),23,10
*
* 2(key),1,4 | 8 | 23(key),10
* 1,2,4 | 8 | 10,23
*
* 1(key) | 2 | 4(key) | 8 | 10(key) | 23
*
* 快速排序是不稳定的排序。
* 快速排序的时间复杂度为O(nlogn)。
* 当n较大时使用比较好,当序列基本有序时不好。
*/
public static void quickSort(int[] nums, int head, int tail) {
if(head>=tail)
return ;
int i=head;
int j=tail;
int key=nums[i];
int temp=0;
while(i!=j){
while(i!=j){
if(key>nums[j]){
temp=nums[j];
nums[j]=nums[i];
nums[i]=temp;
break;
}else {
j--;
}
}
while(i!=j){
if(nums[i]>key){
temp=nums[j];
nums[j]=nums[i];
nums[i]=temp;
break;
}else {
i++;
}
}
}
int mid=i;
quickSort(nums,head,mid-1);
quickSort(nums,mid+1,tail);
}