基本思想 : 将一个将要排序的数据分割成独立的两部分,其中的一部分的所有数据都要比另外一部分的所有数据要小。之后再对这两部分分别继续递归地执行相同的方式直到排序完成。
如果快速排序处在最坏情况下的话,其时间复杂度和冒泡排序相同。O(n2)
平均的性能而言,其查找速度的时间复杂度为O(nlogn),是处在几种排序算法中效率最高的。
其采用的核心思想 : 分治法
1 将问题分解为规模更小的子问题。
2 将这些子问题逐个击破。
3 将解决掉的子问题合并最终得出问题的解。
分治法和递归经常同时应用在算法的设计中。
算法原理 :将要排序的数组中任意选取一个数据(通常是数组的第一个数),将比此数小的放到其左边,然后再将比其大的数放置其右边。然后对得出的左右两个结果再继续重复执行此算法直到全数组排序完成。
具体实现方式 1 取出对比值(一般为数组的第一个值)
2 先从数组的后边往前遍历寻找比对比值小的数,找到的话将找到的数的位置和对比值对换。
3 从数组的前边往后遍历寻找比对比值大的数,找到的话将找到的数的位置和对比值对换。
4 将数组内的值全部对比一次从而根据对比值分出两个部分。
5 之后再对分出的两个部分在进行第一步到第四步的操作。
C语言代码实现如下
void quickSort(int *array, int left, int right) {
// 对数组的所有元素进行过一次排序后,最后其左右坐标或者相等
if (left >= right) {
return;
}
int i = left;
int j = right;
int pivot = array[left];
while (i < j) {
// 寻找结束的条件 找到一个大于pivot的数
// 如果左坐标等于右坐标的时候,证明对数组的所有元素进行过完了一次排序
while (i < j && pivot <= array[j]) {
// 向前寻找
j--;
}
a[i] = a[j];
// 寻找结束的条件 找到一个小于pivot的数
// 如果左坐标等于右坐标的时候,证明对数组的所有元素进行过完了一次排序
while (i < j && pivot >= array[i]) {
// 向后寻找
i++;
}
a[j] = a[i];
}
// 当最后 i = j 的时候,证明数据的一次全元素和pivot的比较完成
// 将对比的pivot值放到最后空出来的那个位置
array[i] = pivot;
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
}
int array[6] = {1, 5, 8, 2, 10, 3};
quickSort(array, 0, 6 - 1);