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

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

  第一:找基准值--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