参考:快速排序 原理:在数列里面找到一个基准值,凡是比这个基准值大的都移动到它前面(假设升序排列),比它大的移动到后面。这样就找到了这个基准值应该在的位置。同理,对基准值左右两侧的数列进行同样处理,直到排序完成。 平均时间复杂度为 O ( n l o g n ) O(n\ log\ n ) O(n log n),在最糟的情况下需要 O ( n 2 ) O(n^2) O(n2) 举例: 选取6作为基准值,确定6在数列中的位置 用两个指针分别指向左端和右端(left, right)。刚开始,让右端right移动,直到right指向的值小于基准值6,也就是4的位置;而后left移动,直到left指向的值大于6,即10的位置,之后两个值交换 之后继续按上述规则移动 交换两个值 直到right = left + 1 然后交换基准值和此时left位置的值,这时候基准值的位置就是其在序列中应在的位置 然后对基准值左右两侧的子序列进行同样的操作,直到排序完成。
参考代码
def swap(arr, i, j): temp = arr[i] arr[i] = arr[j] arr[j] = temp def Quick_Sort(arr, left, right): if left > right: return base = arr[left] [left_t, right_t] = [left, right] while left_t < right_t: #移动右侧指针 while arr[right_t] >= base and right_t > left_t: right_t = right_t - 1 #移动左侧指针 while arr[left_t] <= base and right_t > left_t: left_t = left_t + 1 swap(arr, left_t, right_t) swap(arr, left, left_t) #两侧子序列递归 Quick_Sort(arr, left, left_t - 1) Quick_Sort(arr, right_t + 1, right)测试
arr = [10, 2, 5, 9, 15, 21, 13, 0, 19, 27, 16] if __name__ == '__main__': Quick_Sort(arr, 0, len(arr) - 1) print(arr)C++
void Quick_sort(int arr[], int left, int right) { int mid = left; for (int i = left; i < right; i++) { if (arr[i] < arr[right]) { std::swap(arr[i], arr[mid]); mid ++; } } std::swap(arr[right], arr[mid]); if (mid > left + 1) { Quick_sort(arr, left, mid - 1); } if (mid < right - 1) { Quick_sort(arr, mid + 1, right); } }