代码中写了三种快速排序的方法:
假设列表中第一个元素为中间值,那么就从左、右两个方向朝中间遍历与中间值比较,比其小的放左边,比其小的放右边。
当左、右指针变量相等时,完成第一次排序,保在左边的都比中间值小,在右边的都比中间值大。
然后递归调用该方法,从而实现最终的整个列表排序。
中间值(该值每次假设是列表中的首个位置的值(注意其是变化的))
left --> <----right
简单说,就是每次拿列表中第一个元素的值作为比较的值,然后对列表进行第一次遍历,小的大的放右边,完成第一次排序。
第二次就利用递归的时间,直到列表中的元素小于2个,即可递归调用结束。
python代码如下:
""" 快速排序 """ """ #第一种比较土的办法 def quickSortData(disorderList,start,end): if start > end: return compareValue = disorderList[start] left = start right = end while left<right: #先从右边开始遍历 while right>left and disorderList[right] > compareValue: right -= 1 disorderList[left] = disorderList[right] # 然后再到左边 while left < right and disorderList[left] <= compareValue : left += 1 disorderList[right] = disorderList[left] disorderList[left] = compareValue quickSortData(disorderList, start, left-1) quickSortData(disorderList, left+1, end) """ """ 第二种方法:每次求出high应该在列表中的位置,然后不断递归遍历
""" def partition(arr, low, high): i = (low - 1) # 最小元素索引 pivot = arr[high] for j in range(low, high): # 当前元素小于或等于 pivot if arr[j] <= pivot: i = i + 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1], arr[high] = arr[high], arr[i + 1] return (i + 1) def quickSortData(disorderList,start,end): if start < end: mid = partition(disorderList, start, end) quickSortData(disorderList, start, mid - 1) quickSortData(disorderList, mid + 1, end) """ #第三种方法:这种方法思路比较清晰 def quickSortData(sortedList): if (len(sortedList) < 2): return sortedList mid = sortedList[0] left,right = [],[] sortedList.remove(mid) for i in sortedList: if i<=mid : left.append(i) else: right.append(i) return quickSortData(left) + [mid] +quickSortData(right) """ def main(): data = list(map(int,input("请输入需要排序的列表,逗号间隔:").split(","))) #第一种方法 #quickSortData(data,0,len(data)-1) # 第二种方法 quickSortData(data,0,len(data)-1) #第三种方法 #dataList = quickSortData(data) print("快速排序后的列表为:",end="") print(data) #print(dataList) if (__name__ == "__main__"): main()
第二种方法:每次求出high应该在列表中的位置,然后不断递归遍历