在编程中,排序是非常一个实用的算法。通常我们用来将一组数据升序或降序排列。但是排序也有不同的方法,他们的平均排序效率也不同。对于排序的数据较大时,我们通常使用快速排序(Quick Sort)。因为他的效率就与他的名字一样非常快,其平均复杂度为 O(nlogn)。下面我们来看看他的使用方法。
先写下快速排序的函数框架。
1 | void quicksort(int *arr, int left, int right) { |
先创建一个void
类型的函数, 函数中需要3个参数
- arr 表示数组名
- left 表示左边界
- right 表示右边界
创建变量。
1 | void quicksort(int *arr, int left, int right) { |
这些变量将会被用来遍历数组和交换数值。一共需要四个变量:
- i 表示遍历的左边界
- j 表示遍历的右边界
- temp 用于后面的交换2个元素
- pivot 作为中间点和其他元素比较,方便排序
写个while
循环开始排序
1 |
|
当 i <= j 时才遍历数组。
开始遍历两侧元素。
1 |
|
- 第一个
while
用于检测左侧的元素是否都小于 pivot, 如果是,则使 i ++。
这可以用来判断是否需要对数组左侧执行排序。 - 第二个
while
用于检测右侧的元素是否都大于 pivot, 如果是,则使 j —。
这可以用来判断是否需要对数组右侧执行排序。
如果 i <= j 则交换两个元素的值。
1 | void quicksort(int *arr, int left, int right) { |
这样交换会使数组升序排列,如果交换这里没有 temp 作为临时变量的话,其中一个元素的值就会丢失。为了防止丢失,需要以下的过程:
- 将 arr[ i ] 的值复制给 temp
- 将 arr[ j ] 的值赋值给 arr[ i ]
- 将 temp 的值赋值给 arr[ j ]
- i++
- j—
判断两边的数组是否已排好序
1 |
|
通过两个递归调用,对左侧数组排序,当排完左侧时,再排右侧数组。
测试函数
1 |
|
经过调试,运行结果为0 1 4 7 12 16 19 34 44 99
与预期相同。快速排序大功告成。