快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快排过程:
- 一个数组arr[]
- 选定left=0,right=arr.length-1,选定一个特定的值(在此假设特定值选取temp=arr[left])
- 将特定值temp和arr[right]比较,如果temp<arr[right],则right–;如果temp>arr[right],则arr[left]=arr[right],然后left++;
- 将temp和arr[left]比较,如果temp>arr[left],则left++;否则,arr[right]=arr[left],然后right–;
- 重复以上第3、4步,直到left不小于right,这得到特定值在有序数列中的位置,此时left=right,将arr[right]=temp。
- 以上3、4、5步为一趟快速排序,同时特定值将序列分文两部分(分治),左边部分的任何一个元素小于特定值,右边部分的任何一个元素大于特定值。
- 重复3,4,5步知道排序完成(递归)。
Java代码实现
package algorithm;
/**
* 快速排序
*/
import java.util.Arrays;
public class FastSort {
//一趟快排
public static int sort(int[] arr,int left,int right){
int l=left;
int r=right;
int temp=arr[left];
while(l<r){
while(l<r && temp<arr[r]){
r--;
}
if(l<r){
arr[l]=arr[r];
l++;
}
while(l<r && temp>arr[l]){
l++;
}
if(l<r){
arr[r]=arr[l];
r--;
}
}
arr[r]=temp;
return r;
}
//使用递归算法
public static void fastSort(int[] arr,int left,int right){
if(left<right){
int index=sort(arr,left,right);
fastSort(arr,left,index);
fastSort(arr,index+1,right);
}
}
public static void main(String[] args){
int[] arr={9,3,5,7,1,2,0,4,6,8};
fastSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
}