数据结构实验之排序八:快速排序

数据结构实验之排序八:快速排序
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description

给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使用STL。

Input

连续输入多组数据,每组输入数据第一行给出正整数N(≤10^5),随后给出N个整数,数字间以空格分隔。
Output

输出排序后的结果,数字间以一个空格间隔,行末不得有多余空格。
Example Input

8
49 38 65 97 76 13 27 49
Example Output

13 27 38 49 49 65 76 97
Hint

Author

接下来是快排的代码,说实在的,对这个代码一直不熟练,需要强加联系

#include <stdio.h>
void qsort(int a[], int left, int right)
{
    int x = a[left], i = left, j = right;
    if (left >= right)
    {
        return ;
    }
    while (i < j)
    {
        while (i < j && a[j] >= x)
        {
            j--;
        }
        a[i] = a[j];
        while (i < j && a[i] <= x)
        {
            i++;
        }
        a[j] = a[i];
    }
    a[i] = x;
    qsort(a, left, i - 1);
    qsort(a, i + 1, right);
}
int main()
{
    int n, a[100010], i;
    while (~scanf ("%d", &n))
    {
        for (i = 0; i < n; i++)
        {
            scanf ("%d", &a[i]);
        }
        qsort(a, 0, n - 1);
        for (i = 0; i < n; i++)
        {
            printf ("%d%c", a[i], i < n - 1 ? ' ' : '\n');
        }
    }
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 快速排序是一种高效的排序算法,它的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序的时间复杂度为O(nlogn),是一种比较快速的排序算法。 ### 回答2: 快速排序是一种基于分治法的高效的排序算法,被广泛应用于实际的排序问题中。其核心思想是选取一个枢轴元素将待排序序列分成两个子序列,一个子序列中的所有元素小于枢轴,另一个子序列中的所有元素大于枢轴,然后对这两个子序列分别进行递归排序,最终得到有序序列。 下面我们来分步讲解快速排序算法的实现过程: 1.选择枢轴 在实现快速排序算法时,一般采用三数取中法选取枢轴元素。即从待排序序列的第一个元素,中间元素和最后一个元素中选取中间值作为枢轴元素。 2.划分子序列 选取了枢轴元素后,接下来就需要根据枢轴元素将待排序序列划分成两个子序列。划分时需要从序列两端开始向中间扫描,将小于枢轴元素的元素放到左边的子序列中,大于枢轴元素的元素放到右边的子序列中。当左右两端的扫描相遇时结束扫描,最终得到两个子序列。 3.递归排序 接下来对划分后的两个子序列进行递归排序,重复上述过程,直到子序列中只包含一个元素为止。这时,所有子序列都已排序好,整个序列也就变成有序的了。 需要注意的是,在实现快速排序算法时,应该注意边界问题,尤其是递归过程中的边界条件的设置,否则可能会导致死循环或越界等错误。 快速排序算法的时间复杂度为O(nlogn),是一种十分高效的排序算法。其应用范围也非常广泛,几乎包括了所有需要排序的领域。在实际应用中,我们可以根据需要对快速排序算法进行一定的改进,以满足实际需求。例如,在排序大量数据时,我们可以采用并行化的方法,将待排序序列分成多个子序列并行地进行排序,以提高排序效率。 ### 回答3: 快速排序是一种基于比较的排序算法,它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再递归地对这两部分数据分别进行快速排序快速排序的时间复杂度为O(nlogn),是目前比较常用的排序算法之一。 快速排序的基本思想是选定一个基准元素,将数组中小于等于基准元素的元素放到其左边,大于基准元素的元素放到其右边,然后递归地对左、右子数组进行快速排序。具体实现时,我们通常选择待排序数组中的第一个元素作为基准元素,将数组从第二个元素开始扫描,把小于等于基准元素的放到左边,大于基准元素的放到右边,最后将基准元素插入到中间位置,这样排序之后基准元素就在它的最终位置上了。 快速排序的关键在于如何把小于等于基准元素的元素放到左边,大于基准元素的元素放到右边。这可以通过一趟扫描来实现,具体实现时可以采用双指针法,即设置一个指针i指向数组的第二个元素,一个指针j指向数组的最后一个元素,然后在数组中查找第一个小于等于基准元素的元素和第一个大于基准元素的元素,交换它们的位置,直到i>=j为止。这样扫描结束后,i所在的位置就是基准元素的位置。 快速排序的递归结束条件是子数组只包含一个元素或为空。这样,每次递归都会使待排序的数组规模减半,排序的复杂度就为O(nlogn)。 总结一下,快速排序是一种高效的排序算法,具有简单、快速、不需要额外的存储空间等优点,但是在最坏情况下的时间复杂度会达到O(n^2),因此需要注意基准元素的选择和算法的实现细节,以避免这种情况的出现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值