用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;
}

 

posted @ 2023-05-19 21:54  fognight  阅读(1078)  评论(0)    收藏  举报