排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

时间:2023-03-08 19:50:19

快速排序有三大要素 分别是

第一:找基准值--key

第二:分区

第三:比较数字大小

先来看下快速排序流程: 基准值key选取了第一个元素78 基准值是可以任意一个元素

因为选择了最左边的数据,那么就从右边开始遍历

排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

经过上一轮变化key变成了78 位置也变了,开始从key的左边遍历,当 i=j的时候,结束遍历,开始分区

排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

分区后,每个区再进行上面的比较

排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

继续分区,直到分区里面只有两个或者3个元素,分区后,每个分区继续比较

排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

现在每个分区已经最小了,获得最后排列的值

排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

Python实现过程(正序),一共13行代码

def quickSortASC(nums,start,end):
#start 和 end用于 分区,当start=end的时候不进行递归
if start < end:
i,j = start,end
key = nums[i]
while i < j:
while (i<j) and (key<=nums[j]):
j = j-1
#交换
nums[i],nums[j] = nums[j],nums[i]
while (i<j) and (key>=nums[i]):
i=i+1
#交换
nums[j],nums[i] = nums[i],nums[j]
#nums[i] = key
#开始递归
quickSortASC(nums,start,i)
quickSortASC(nums,i+1,end)

调用

if __name__ == "__main__":
num_arr = [23, 34, 544, 234, 54, 554, 78, 656]
quickSortASC(num_arr,0,len(num_arr)-1)
print(num_arr)#[23, 34, 54, 78, 234, 544, 554, 656]

JavaScript 实现代码

	function swap_arr(arr,i,j){
var tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
function quickSortASC(nums, start, end) {
if(start < end) {
var i = start
var j = end
var poit = nums[start]
console.log(i, j, poit)
while(i < j) {
while(i<j&&poit<=nums[j]){
j--
}
swap_arr(nums,i,j)
while(i<j&&poit>=nums[i]){
i++
}
swap_arr(nums,i,j)
}
quickSortASC(nums,start,i)
quickSortASC(nums,i+1,end)
}
} num_arr = [23, 34, 544, 234, 17, 554, 78, 656]
quickSortASC(num_arr,0,7)
console.log(num_arr)//17,23,34,78,234,544,554,656