快速排序算法
堆排序和快速排序可以说是面试排序最容易考到的点了,本着非常应试的目的,温习一下快排的想法。
public static void quickSort(int []num,int start,int end)
{
if(start>=end) return;
int key=num[start];
int low=start,high=end;
while(low<high)
{
while(low<high&&num[high]>=key) high--; //填坑法
if(low<high) num[low]=num[high];
while(low<high&&num[low]<=key) low++;
if(low<high) num[high]=num[low];
}
num[low]=key;
quickSort(num,start,low-1);
quickSort(num,low+1,end);
}
三路快速排序
今天做题遇到了这个算法,太神奇了。直接上题,记录一下
题目:给出一个仅包含0,1,2的数组,请对数组进行排序。要求仅使用常数空间的一趟扫描
class Solution {
public void sortColors(int[] nums) {
int l=-1,r=nums.length,i=0;
while(i<r)
{
if(nums[i]==0)
swap(nums,++l,i++);
else if(nums[i]==1)
i++;
else if(nums[i]==2)
swap(nums,i,--r);
}
}
public static void swap(int[]nums,int a,int b)
{
int temp=nums[a];
nums[a]=nums[b];
nums[b]=temp;
}
}