package com.lin.quicksort;
import java.util.Arrays;
import com.lin.dao.SortService;
public class QuickSort
{
public static void main(String[] args)
{
int[] arr = SortService.getArr(1000000, 100);
quick(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static int sort(int[] arr, int left, int right)
{
if (arr == null || arr.length <= 0)
{
return -1;
}
if (left < 0 || right < 0 || left > right)
{
return -1;
}
/*
* [14, 44, 60, 82, 76, 4, 82, 97] 第一个作为 标准 midVal = 14 把14拿出来
* [NULL, 44, 60, 82, 76, 4, 82, 97] 先从右边开始 把小于 14 的值 4 将null变为4
* [4, 44, 60, 82, 76, 【4】, 82, 97] 右边的【4】就无意义可以替换 再从左边拿大于14的值 44 替换 4
* [4, 【44】, 60, 82, 76, 44, 82, 97] 左边【44】无效可以替换 最终左右下标会相同定位于【44】
* [4, 【44】, 60, 82, 76, 44, 82, 97] 【44】无意义可以替换为 标准【中轴】 返回下标 left或right
*/
int midVal = arr[left];
while (left < right)
{
// left<right防止 right==1时 --造成下标越界
// 或 left== ++时最大值越界
while (arr[right] >= midVal && left < right)
{
right--;
}
arr[left] = arr[right];
// = 等于是为了防止 arr[left]==arr[right]变成死循环
while (arr[left] <= midVal && left < right)
{
left++;
}
arr[right] = arr[left];
}
// 最后left==right
arr[right] = midVal;
return right;
}
public static void quick(int[] arr, int begin, int end)
{
if (begin >= end)
{
return;
}
int temp = sort(arr, begin, end);
quick(arr, begin, temp-1);
quick(arr, temp+1, end);
}
}
|