C++算法和数据结构——快速排序
C++算法和数据结构——快速排序
核心思想
快速排序运用了分治的思想。
1.分解: 将要解决的问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。
2.治理: 求解各个子问题。由于各个子问题与原问题形式相同,只是规模较小而已,而当子问题划分得足够小时,就可以用简单的方法解决。
3.合并: 按原问题的要求,将子问题的解逐层合并构成原问题的解。
具体步骤
1.分解: 先从数列中取出一个元素作为基准元素。以基准元素为标准,将问题分解为两个子序列,使小于或者等于基准元素的子序列在左侧,使大于基准元素的子序列在右侧。
2.治理: 求解各个子问题。由于各个子问题与原问题形式相同,只是规模较小而已,而当子问题划分得足够小时,就可以用简单的方法解决。
3.合并: 按原问题的要求,将子问题的解逐层合并构成原问题的解。
代码
#include <stdio.h>
int a[101], n; // 定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left, int right) {
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
int i, j, t, temp;
if (left > right)
return;
temp = a[left]; // temp中存的就是基准数
i = left;
j = right;
while (i != j) {
// 顺序很重要,要先从右往左找
while (a[j] >= temp && i < j)
j--;
// 再从左往右找
while (a[i] <= temp && i < j)
i++;
// 交换两个数在数组中的位置
if (i < j) { // 当哨兵i和哨兵j没有相遇时
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
// 最终将基准数归位
a[left] = a[i];
a[i] = temp;
quicksort(left, i - 1); // 继续处理左边的,这里是一递归的过程
quicksort(i + 1, right); // 继续处理右边的,这里是一递归的过程
return;
}
int main () {
int i;
// 读入数据
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
quicksort(1, n); // 快速排序调用
// 输出排序后结果
for (i = 1; i <= n; i++)
printf("%d ", a[i]);
return 0;
}
结束
下期讲数据结构,拜拜!