用C语言实现快速排序(quicksort)
快速排序的主要思想是选定一个基准数,将数组中小于该数的放在左边,大于该数的放在右边,然后再分别对左右两部分进行排序。这里我们以数组第一个数为基准数。
具体实现如下:
1. 主函数中读入待排序数组元素的个数 n 以及各个元素 a[i]。
2. 调用快速排序函数 quicksort 对整个数组进行排序,传入参数为数组左右边界的下标 left 和 right。初始调用时应该是 quicksort(1,n)。
3. 在快速排序函数中,先判断数组是否为空(即 left > right),是则直接返回。
4. 取得 a[left] 作为基准元素 temp,同时 i 和 j 分别指向数组左端和右端。
5. 在 while 循环内部,首先从右往左找到第一个小于 temp 的元素 a[j]。若找到则退出循环;否则说明 a[right] 比 temp 小,将 a[right] 放到 a[left] 的位置,并跳出循环。
6. 接着从左往右找到第一个大于 temp 的元素 a[i]。若找到则退出循环;否则说明 a[left] 比 temp 大,与上一步类似地将 a[left] 放到 a[right] 的位置,并跳出循环。
7. 如果 i < j,说明此时 i 位置上的元素比 j 位置上的元素大,因此交换 a[i] 和 a[j] 的值。
8. 重复 5-7 步,直到 i >= j 时停止循环。
9. 将 a[left] 的值替换为 a[i],a[i] 的值替换为 temp,此时以 temp 为基准元素的一次快速排序完成。
10. 分别对 temp 左侧的子数组和右侧的子数组进行递归排序,即调用 quicksort(left, i-1) 和 quicksort(i+1, right)。
11. 排序完毕后得到的数组按顺序输出即可。
此算法的平均时间复杂度为O(nlogn),但最坏情况下会退化为O(n^2)。
代码如下:
#include<bits/stdc++.h> using namespace std; int a[101], n; //定义变量 void quicksort(int left, int right) { if (left > right) //递归出口 return; int i, j, temp, t; temp = a[left]; //将左边第一个数作为基准数 i = left; j = right; while (i < j) { //在i<j的情况下不断交换两数位置 while (a[j] >= temp && i < j) //从右往左找到小于基准数的数 j--; while (a[i] <= temp && i < j) //从左往右找到大于基准数的数 i++; if (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() { cin >> n; //输入数组长度 for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); //输入数组元素 } quicksort(1, n); //排序 for (int i = 1; i <= n; i++) { cout << a[i] << " "; //输出 } return 0; }

浙公网安备 33010602011771号