快速排序
基于分治算法
算法步骤:
- 确定分界点x
- 移动数组内的元素,让<=x的数据放在 x的左边,>=x的数据放在x的右边 (记得要将x放在中间)
- 递归去处理x的左半部分和右半部分
思想的C++简单实现:
void quick_sort(int a[],int l,int r){
if(l+1>=r) return ;
vector<int> left,right,eq;
for(int i=l;i<r;i++){
if(a[i]>a[l]){
left.push_back(a[i]);
}else if(a[i]<a[l]){
right.push_back(a[i]);
}else{
eq.push_back(a[i]);
}
}
for(int i=l;i<l+left.size();i++)
a[i]=left[i-l];
for(int i=l+left.size();i<l+left.size()+eq.size();i++)
a[i]=eq[i-l-left.size()];
for(int i=l+left.size()+eq.size();i<r;i++)
a[i]=right[i-l-left.size()-eq.size()];
quick_sort(a,l,l+left.size());
quick_sort(a,l+eq.size()+left.size(),r);
}
但是中间那部分真的太不优美了,Plus版本如下(思想依旧没变):
注意此处的r取值为数组长度-1
void quick_sort(int a[],int l,int r){
if(l>=r) return ;
int x=a[l],i=l-1,j=r+1;
while(i<j){
do i++; while(a[i]<x);
do j--; while(a[j]>x);
if(i<j) swap(a[i],a[j]);
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
Java实现
package Algorithm;
import java.util.Arrays;
public class Algorithm {
private static void swap(Integer[] arr,int i,int j){
Integer temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void quickSort(Integer[] arr,int l,int r){
if(l>=r) return ;
int x=arr[l],i=l-1,j=r+1;
while(i<j){
do i++; while(arr[i]<x);
do j--; while (arr[j]>x);
if(i<j) swap(arr,i,j);
}
quickSort(arr,l,j);
quickSort(arr,j+1,r);
}
public static void main(String[] args) {
Integer[] arr =new Integer[]{1,5,9,3,4,7,1,0,1,-5};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
}