算法思想:从序列中任取一个元素(一般是第一个元素)作为中心,所有比它小的都放左边,所有比它大的都放右边,从而形成两个子表。再对两个子表中心选择中心元素并做上述调整。
一次快速排序过程:
Java代码实现过程:
public static int[] quicksort(int[] nums,int left,int right){
if (left<right){
//将数组分成左右两个部分
int pos = partition(nums,left,right);
//划分左子表
quicksort(nums,left,pos-1);
//划分右子表
quicksort(nums,pos+1,right);
}
return nums;
}
//一次快速排序过程 返回pivot所在的位置 因为pivot将nums分成了两个部分
public static int partition(int[] nums,int left,int right){
//选取基准元素
int pivot = nums[left];
while (left<right){
//找到第一个小于pivot的数字
while (right>left&&nums[right]>=pivot){
right--;
}
nums[left] = nums[right];
//找第一个大于pivot的数字
while(left<right&&nums[left]<=pivot){
left++;
}
nums[right] = nums[left];
}
nums[left] = pivot;
return left;
}
JavaScript实现过程:
<script>
var nums = [8,9,1,7,2,3,5,4,6,0];
quicksort(nums,0,nums.length-1);
console.log(nums);
function quicksort(nums,left,right){
if(left<right){
//划分为两个部分
var pos = partiton(nums,left,right);
//对左右子表分别排序
quicksort(nums,left,pos-1);
quicksort(nums,pos+1,right);
}
}
//一次快速排序划分
function partiton(nums,left,right){
var pivot = nums[left];
while(left<right){
while(left<right&&nums[right]>=pivot){
right--;
}
nums[left] = nums[right];
while(left<right&&nums[left]<=pivot){
left++;
}
nums[right] = nums[left];
}
nums[left] = pivot;
return left;
}
</script>