快速排序是一种时间复杂度为O(NlogN)的排序算法,其基本思想是:通过一趟排序将待排记录划分为独立的两部分,成为前半区和后半区,其中,前半区记录的关键字均不大于后半区的关键字,然后分别对这两个区进行快速排序,从而使整个序列有序。
一趟排序的具体做法:设两个位置指示变量i和j,他们的初值分别指向序列的第一个记录和最后一个记录,设参考值(通常是第一个记录)的关键字为pivot,则首先从j所指示的位置向左搜索,找到第一个关键字小于pivot的记录时将这个记录向前移动到i所指示的位置,然后从i所指示的位置向右搜索,找到第一个关键字大于pivot的记录时将该记录后移到j所指示的位置,重复i与j直到相等为止。
public class quickSort {
public static void main(String[] args) {
int[] nums = new int[]{1,6,3,2,7,1,9,0,3,15};
quickSortTest(nums );
for(int x:nums) System.out.print(x+" ");
}
public static void sort(int[] array,int left, int right){
if(left >= right) return; //如果少于一个数字
int pivot = array[left]; //一般选择第一个数字为参考值
int i = left;
int j = right;
while(i < j && array[j] >= pivot) j--; //先从右往左数,直到遇到比参考值小的数终止
while(i < j && array[i] <= pivot) i++;//从左往右数,直到遇到比参考值大的数终止
if(i < j){
int temp = array[i]; //交换位置
array[i] = array[j];
array[j] = temp;
}
array[left] = array[i]; //参考值放在中间
array[i] = pivot;
sort(array,left,i-1); //左边数列进一步快速划分
sort(array,i+1,right);//右边数列进一步划分
}
public static void quickSortTest(int[] nums){
int len;
if(nums == null
|| (len = nums.length) == 0
|| len == 1) {
return ;
}
sort(nums, 0, len - 1);
}
}