1.快速排序
我们先看代码:
public class quick {
public static void main(String[] args) {
//快速排序
int arr[] = {21, 532, 54, 32, 612, 34,
56, 12, 8, 12, 53,78,65,40,44};
int start=0,end=arr.length-1;//第一个数的位置和最后一个数的位置
QuickSort(arr,start,end);
System.out.println(Arrays.toString(arr));
}
public static void QuickSort(int arr[],int start,int end){
if (start >= end)
return;
int i = start;
int j = end;
// 第一个数和最后一个的位置
int baseval = arr[start];//把第一个的数传给baseval
while (i < j)
{
// 从右向左找比第一个数小的数
while (i < j && arr[j] >= baseval)
{
j--;//从后向前依次寻找
}
if (i < j)
{
arr[i] = arr[j];//把找到的比第一个数小
//的数,替换掉第一个数
i++;
}
// 从左向右找比基准数大的数
while (i < j && arr[i] < baseval)
{
i++;//依次向后
}
if (i < j)
{
arr[j] = arr[i];//把找到的比第一个数大
//的数,替换掉第一个数
j--;
}
}
arr[i] = baseval;
//递归
QuickSort(arr, start, i - 1);
QuickSort(arr, i + 1, end);
}
快速排序的基本思想是:
第一步:通过选取数组中的一个数作为基本数,把比他小的数排在它前边。
// 从右向左找比第一个数小的数
while (i < j && arr[j] >= baseval)
{
j--;//从后向前依次寻找
}
if (i < j)
{
arr[i] = arr[j];//把找到的比第一个数小
//的数,替换掉第一个数
i++;
}
第二步:把比基准数大的数排在它后边。
while (i < j && arr[i] < baseval)
{
i++;//依次向后
}
if (i < j)
{
arr[j] = arr[i];//把找到的比第一个数大
//的数,替换掉第一个数
j--;
}
通过选取一个基准值后,我们得到一个数组,比基准值大的在它后边,比基准值小的在它前边,但是在基准数前面还有后面的数都是无序的,所以要通过下面三行代码进行两次递归调用,把所有数排列好顺序。
arr[i] = baseval;
//递归
QuickSort(arr, start, i - 1);
QuickSort(arr, i + 1, end);
为什么要i-1,和i+1呢,因为要基准数在数组中的位置已经确定,所以数组长度要减1。
start, i - 1
i + 1, end