算法分析:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。
一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。接着分别比较左右两边的序列,重复上述的循环。
复杂度:理想为O(nlogn),最差为O(n^2)
public void quicksort(int[] arr,int start,int end){
if(start>=end){
return;
}
//把数组中的第0个数作为基数
int stard=arr[start];
int low=start;
int high=end;
while(low<high){
//右边的数比标准数大
while(low<high&&stard<=arr[high]){
high--;
}
//右边的数替换左边
arr[low]=arr[high];
while(low<high&&stard>=arr[low]){
low++;
}
arr[high]=arr[low];
}
arr[low]=stard;
//处理所有小的数
quicksort(arr,start,low);
//处理所有大的数
quicksort(arr,low+1,end);
}