快速排序是最常用的排序方法。
时间复杂度: O(nLog^n)
快速排序也采用的分支的方法,但是没有像归并排序那样彻底分割
步骤
- 从数组中间选择一项作为主元
- 创建两个指针,左边一个纸箱数组第一个项,右边指向最后一个项,移动左边指针直到找到一个比主元大的项,接着,移动右指针直到找一个一个比主元小的项,然后交换他们,重复此步骤。直到左指针超过了右指针。这个过程将使得比主元小的元素都在左边, 大的都在右边。这一步叫做划分操作
- 接着,算法对划分后的小数组重复 1 、2 步骤,直至数组完全排序
JavaScript
const arr = [4,77,2,5,33,4,2,7,9,4,666,333,2,555,66,4,234]function partition (arr, left, right) {var pivot = arr[Math.floor((left + right) / 2)]let i = leftlet j = rightconsole.log('pivot', pivot, i, j)while (i <= j) {while (arr[i] < pivot) {i++}while (arr[j] > pivot) {j--}if (i <= j) {swap(arr, i, j)i++j--}}return i}function quick(arr, left, right) {let index = 0if (arr.length > 1) {index = partition(arr, left, right)if (left < index - 1) {quick(arr,left,index - 1)}if (index < right) {quick(arr,index,right)}}return arr}function swap(arr, i, j) {let temp = arr[i]arr[i] = arr[j]arr[j] = temp}console.log(quick(arr, 0, arr.length - 1));
Swift
func patition( arr:inout Array<Int>, left: Int, right: Int) -> Int {let pivot = arr[(left + right) / 2]var i = leftvar j = rightwhile i <= j {while arr[i] < pivot {i = i + 1}while arr[j] > pivot {j = j - 1}if i <= j {arr.swapAt(i, j)i = i + 1j = j - 1}}return i}func quick(arr: inout Array<Int>, left: Int, right: Int) -> Array<Int> {if arr.count == 1 {return arr}var index = 0if arr.count > 0 {index = patition(arr: &arr, left: left, right: right)if left < index - 1 {let _ = quick(arr: &arr, left: left, right: index - 1)}if index < right {let _ = quick(arr: &arr, left: index, right: right)}}return arr}
