目录
前言
我们有八种常用的排序算法,大致可以分为五大类:
一、什么是快速排序
快速排序(Quicksort)是对冒泡排序算法的一种改进。
理解:主要通过多次比较和交换来实现排序。
流程:(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。一般设置第一个值。
(2)将大于或等于分界值的数据集中放在数组右边,小于分界值的数据集中到数组的左 边。此时,左边部分中各元素都小于或等于分界值,右边元素都大于等于分界值。
(3)然后左边和右边的数据继续分为两个部分排序,左边部分找一个分界值分为两个部 分,右边也找一个分界值,依次递归下去,最终得到排序好的序列。
二、深度理解
1、一次快速排序
看的出,我们运用了二分的思想,首先我们选择一个分界点的数字,定义左右两端的指针,从左到右开始扫描,R[hi] < temp,将R[hi]移动至lo所在位置 => 从右往左进行扫描,直到R[lo] > temp,将R[lo]移动到hi所在位置上,左右端指针在排序过程中从数组的两端往中间进行靠近,直到hi == lo。而快速排序则要进行多次快排过程,直到划分的区间最后长度仅为1.
2、经典流程
3、动图理解
三、代码案例
Java快速排序方法:
package demo4;
public class QuickSort {
public static void main(String[] args){
int[] arr = new int[] {3,4,6,7,2,7,2,8,0};
quockSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr))
}
//快速排序的方法:参数传入一个数组,一个递归的开始位置和结束位置
public static void quickSort(int[] arr,int start, int end){
if(start<end){
//把数组中的第0个数组作为标准数
int stard = arr[start];
//记录需要排序的下标
int low = start;
int high = end;
//循环找比标准数大的数和小的数
while(low<high){
//右边的数字比标准数大
while(low<high&&start<=arr[high]){
high--;
}
//使用右边的数字替换左边的数
arr[low] = arr[high];
//如果左边的数字比标准数小
while(low<high&&arr[low]<=stard){
low++;
}
arr[high]=arr[low];
}
//把标准数赋值给重复的高或低所在位置的元素
arr[low] = stard
//处理所有的小的数字
quickSort(arr,start,low)
//处理所有大的数字
quickSort(arr,low+1,end)
}
}
}
附加一个python快速排序:
def quick_sort(data):
"""快速排序"""
if len(data) >= 2: # 递归入口及出口
mid = data[len(data)//2] # 选取基准值,也可以选取第一个或最后一个元素
left, right = [], [] # 定义基准值左右两侧的列表
data.remove(mid) # 从原始数组中移除基准值
for num in data:
if num >= mid:
right.append(num)
else:
left.append(num)
return quick_sort(left) + [mid] + quick_sort(right)
else:
return data
# 示例:
array = [2,3,5,7,1,4,6,15,5,2,7,9,10,15,9,17,12]
print(quick_sort(array))
# 输出为[1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 9, 9, 10, 12, 15, 15, 17]