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

Problem Description

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

 

Input

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

Output

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

Sample Input

8
49 38 65 97 76 13 27 49

Sample Output

13 27 38 49 49 65 76 97

Hint

 

Source

注意:自己写的时候没有碰见什么问题,可能递归的时候需要注意添加while条件,当Low小于high时需要注意写上,这样递归才可以结束。还有一个值得注意的问题是,在主函数中调用时就需要将end赋值为n-1,当end赋值为n的时候会出现第一次关键字前的序列未排好的情况,不清楚什么原因。

代码:

#include <iostream>

using namespace std;

void quick_sort(int a[],int start,int end)
{
    if(start<end)
    {
        int i=start,j=end,key=a[start];
        while(i<j)
        {
            while(i<j&&a[j]>=key)
            {
                j--;
            }
            if(i<j)
            {
                a[i++]=a[j];
            }
            while(i<j&&a[i]<=key)
            {
                i++;
            }
            if(i<j)
            {
                a[j--]=a[i];
            }
        }
        a[i]=key;
        quick_sort(a,start,i-1);
        quick_sort(a,i+1,end);
    }
}

void show(int a[],int n)
{
    for(int i=0; i<n-1; i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<a[n-1]<<endl;
}
int main()
{
    int n;
    int a[100000];
    while(cin>>n)
    {
        for(int i=0; i<n; i++)
        {
            cin>>a[i];
        }
        quick_sort(a,0,n-1);
        show(a,n);
    }
    return 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、付费专栏及课程。

余额充值