快速排序是一种 排序方式,通常是取左边第一个数作为基数,然后从右边看,找到比他小的,交换,然后,在从左边看,找到比他大的,交换同时改变基数(这也是方式二的实现方式)。做完一次快排后,进行递归,遍历左部分和右部分。
方式1:取一个基数,最后将基数插入中间位置(将基数单独拿了出来)
// 快排实现方式1
public void quicksort(int[] res, int left, int right){
if(left>right){
return ;
}
int basic = res[left];
int i = left;
int j = right;
while(left<right){
// 找到右边小于基数的下标
while(left<right && res[right]>basic){
right--;
}
if(left<right){
res[left] = res[right];
left++;
}
// 找到左边大于基数的下标
while(left<right && res[left]<basic){
left++;
}
if(left<right){
res[right] = res[left];
right--;
}
}
res[left] = basic;
quicksort(res,i,left-1);
quicksort(res,left+1,j);
}
方式2:在排序过程中交换数,交换时,基数也被改变,所以,最后不用插入基数。
public void quicksort(int[] res, int left, int right){
if(left>right){
return ;
}
int basic = res[left];
int i = left;
int j = right;
while(i<j){
//找到右边小于基数的小标
while(i<j && res[j]>basic){
j--;
}
if(i<j){
swap(res,i,j);
basic = res[j];
i++;
}
//找到坐标大于基数的小标
while(i<j && res[i] < basic){
i++;
}
if(i<j){
swap(res,i,j);
basic = res[i];
j--;
}
}
quicksort(res,left,i - 1);
quicksort(res,i+1,right);
}
public void swap(int[] res, int i, int j){
int temp = res[i];
res[i] = res[j];
res[j] = temp;
}