社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
快速排序是对冒泡排序的一种改进
下面用例子来理解快速排序
给出如下数组:
首先先找出一个基准数据=2,然后再数组两端设首指针和尾指针
然后尾指针开始扫描,遇到小于基准数据的arr[low]=arr[high] 将这个值赋值给low
然后首指针开始扫描,遇到大于基准数据的 arr[high] = arr[low] 将这个值赋值给high
然后尾指针开始扫描,此刻low=high,那么此刻这个位置就是基准数2的位置(arr[low]=2),这个位置也是2的排序后的正确位置
然后此刻数组被分成两个部分
再分别对上下两部分重复上面的操作(就可以把上下俩部分想象成是新的两个数组,然后进行操作)
直到变成一个个单个数,此时证明排序完成
1.根据原理可以想象,快速排序,有点像选出一个基准数然后给这个基准数找到属于它的正确位置
2.不断重复,拆分成子数组,再进行,直到变成一个个单体
public static void main(String[] args) {
int[] arr = { 2, 0, 9 ,1, 8, 5};
quickSort(arr, 0, arr.length - 1);//将数组、起始指针、尾指针传过去
System.out.println("排序后:");
for (int i : arr) {
System.out.print(i+" ");
}
}
private static void quickSort(int[] arr, int low, int high) {
if (low < high) {//low==起始指针、high==尾指针
// 找寻基准数据的正确索引
int index = getIndex(arr, low, high);//返回return low
//那么运行一次之后index=返回的row;
//然后再下面递归调用quickSort分区tmp前的部分、和后面的部分、分别再进行一次快速排序
//进行迭代对index之前和之后的数组进行相同的操作使整个数组变成有序
quickSort(arr, 0, index - 1);
quickSort(arr, index + 1, high);
}
}
private static int getIndex(int[] arr, int low, int high) {
// 基准数据
int tmp = arr[low];
//按照顺序先从后往前,在从前往后
while (low < high) {//low=higt证明是单个元素一组,即位置已经排好
// 当队尾的元素大于等于基准数据时,向前挪动high指针
while (low < high && arr[high] >= tmp) {
high--;
}
// 如果队尾元素小于tmp了,需要将其赋值给low
arr[low] = arr[high];
//以上是从后往前
//----------------------------------------------
//以下是从前往后
// 当队首元素小于等于tmp时,向前挪动low指针
while (low < high && arr[low] <= tmp) {
low++;
}
// 当队首元素大于tmp时,需要将其赋值给high
arr[high] = arr[low];
}
// 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置
// 由原理部分可以很清楚的知道low位置的值并不是tmp,所以需要将tmp赋值给arr[low]
arr[low] = tmp;
return low; // 返回tmp的正确位置
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!