快速排序的思路:一组随机数字,定义取第一个下标的数字为中心轴,然后数组的两侧下标依次与中心轴值比较大小进而向着数组中间位移。
右侧下标向左位移,左侧下标向右位移。
右侧下标向左位移条件为:大于等于中心轴的值时向左移动。
左侧下标向右位移条件为:小于等于中心轴的值时向右移动。
左右下标处于相同位置时,将中心轴的值赋予该位置。然后以中心轴为界分割两侧数组,分别在进行上述操作,直至数组不可再分割
public static void main(String[] args) {
int len = 100;
Random random = new Random();
Integer[] arr = new Integer[len];
for (int i = 0; i < len; i++) {
arr[i] = random.nextInt(len);
}
System.out.println("before:"+Arrays.toString(arr));
//shellSort(arr);
quickSort(arr,0,arr.length-1);
System.out.println("after:"+Arrays.toString(arr));
}
/**
* 快速排序
* @param arr
* @param left
* @param right
*/
private static void quickSort(Integer[] arr, int left, int right) {
if(left < right){
Integer pivot = getPivot(arr,left,right);
quickSort(arr,left,pivot - 1);
quickSort(arr,pivot + 1,right);
}
}
private static Integer getPivot(Integer[] arr, int left, int right) {
//获取中心轴
Integer pivot = arr[left];
while(left < right){
//从右向左移动
while(right > left && arr[right] >= pivot){
right -- ;
}
arr[left] = arr[right];
//从左向右移动
while(left < right && arr[left] <= pivot){
left ++ ;
}
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
/**
* 希尔排序
* @param arr
*/
public static void shellSort(Integer[] arr){
for (int i = arr.length; i > 0; i /=2) {
for (int j = i; j < arr.length; j++) {
for (int k = j; k > 0 && k-i>=0; k-=i) {
if(arr[k] < arr[k-i]){
int temp = arr[k-i];
arr[k-i] = arr[k];
arr[k] = temp;
}else{
break;
}
}
}
}
}