排序算法(二)快速排序
快速排序基于分治思想,是在冒泡排序基础上的改进:记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。
快速排序是对冒泡排序的一种改进,是由C.A.R. Hoare于1962年提出的。
快速排序的平均时间性能很好,与插入排序不同,快速排序根据整个文件,把控制当前排序进程的基准关键字放到正确的位置上。
时间复杂度:平均情况下,O(NlogN);最坏情况:O(N2)
空间复杂度:O(NlogN)
稳定性:不稳定
// C: 快速排序 // left = 0; // right = listSize - 1; void quicksort(int list[], int left, int right) { int pivot; int i, j; int temp = 0; if (left < right) { i = left; j = right + 1; pivot = list[left]; //完成一次排序,即将数组中小于pivot的关键字放在左边,大于pivot的关键字放在右边 do { do i++; while (list[i] < pivot); do j--; while (list[j] > pivot); if (i < j) { temp = list[i]; list[i] = list[j]; list[j] = temp; //SWAP(list[i], list[j]); //list[i]和list[j]互换 } } while (i < j); temp = list[left]; list[left] = list[j]; list[j] = temp; //SWAP(list[left], list[j]); quicksort(list, left, j - 1); // 对左半段进行排序; quicksort(list, j + 1, right); // 对右半段进行排序; } }
# Python 3: 快速排序 def quicksort(nums: list, left: int = None, right: int = None): left = 0 if left is None else left right = len(nums) - 1 if right is None else right if left < right: # 分区(partition)操作:对子数组进行原址重排, # 所有比基准元素值小的元素放在基准元素之前, # 所有比基准元素值大的元素放在基准元素之后(相同的数可以到任一边)。 # 划分结束后,基准元素就处于数列的中间位置。 partitionIndex = partition(nums, left, right) quicksort(nums, left, partitionIndex - 1) quicksort(nums, partitionIndex + 1, right) return nums def partition(nums: list, left, right) -> int: pivot = left # 设定基准值 i = pivot + 1 # 设定索引 j = i # 设定遍历指针 while j <= right: if nums[j] < nums[pivot]: # 如果遍历到的数比基准值小,则将索引值与遍历到的数交换位置; swap(nums, j, i) i += 1 j += 1 swap(nums, pivot, i - 1) return i - 1 def swap(nums, i, j): nums[i], nums[j] = nums[j], nums[i]