7—2快速排序

   

给定一个整数序列,请按非递减序输出采用快速排序(递归法)的各趟排序后的结果。注意:每趟排序以排序区间的首元素为枢轴(支点)。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。

输出格式:
对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。

 

#include<stdio.h>
#include <stdlib.h>
int n;
int a[110];
void swap(int s[],int i,int j)
{
    int t=0;
    t=s[i];s[i]=s[j];s[j]=t;
}

void print()
{
    int i=0;
    for(i=0;i<n;i++)
    {
        printf("%d",a[i]);
        if(i==n-1)
        {
            printf("\n");
        
        }else{
            printf(" ");
        }
    }
}

int zhu(int i,int j)
{
        while(i<j)
        {
            while(i<j&&a[i]<=a[j])
            j--;
            if(i<j)
            {
                swap(a,i,j);
                i++;
            }
            while(i<j&&a[i]<=a[j])
            i++;
            if(i<j)
            {
                swap(a,i,j);
                j--;
            }
        }
        return i;
}
int kuai(int l,int r)
{
    int k;
    if(l<r)
    {
    
        k=zhu(l,r);
        print();
        kuai(l,k-1);
        kuai(k+1,r);
    }
    
 } 
int main()
{
    int i=0;
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        kuai(0,n-1);
    }
    return 0;
}

 

### 回答1: 快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将待排序序列分割成两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再按照同样的方对这两部分分别进行排序,直到整个序列为止。 在快速排序的实现中,我们需要选择一个枢轴(支点)元素,将序列分成两个子序列,其中一个序列中的所有元素都比枢轴元素小,另一个序列中的所有元素都比枢轴元素大。然后,我们再对这两个子序列分别进行排序,直到整个序列为止。 按照题目要求,我们需要按照递减输出采用快速排序递归)的各趟排序后的结果。具体实现方如下: 1. 首先,我们需要定义一个快速排序的函数,该函数接受一个整数序列排序区间的起始位置和结束位置作为参数。 2. 在函数中,我们选择排序区间的首元素作为枢轴元素,然后将序列分成两个子序列,其中一个序列中的所有元素都比枢轴元素小,另一个序列中的所有元素都比枢轴元素大。 3. 然后,我们再对这两个子序列分别进行排序,直到整个序列为止。 4. 在排序过程中,我们需要记录每趟排序后的结果,并按照递减输出。 下面是具体的实现代码: ``` #include <iostream> #include <vector> using namespace std; void quickSort(vector<int>& nums, int left, int right, vector<vector<int>>& res) { if (left >= right) return; int i = left, j = right, pivot = nums[left]; while (i < j) { while (i < j && nums[j] >= pivot) j--; if (i < j) nums[i++] = nums[j]; while (i < j && nums[i] < pivot) i++; if (i < j) nums[j--] = nums[i]; } nums[i] = pivot; vector<int> tmp(nums.begin(), nums.end()); res.push_back(tmp); quickSort(nums, left, i - 1, res); quickSort(nums, i + 1, right, res); } int main() { vector<int> nums = {3, 1, 4, 2, 5}; vector<vector<int>> res; quickSort(nums, , nums.size() - 1, res); for (auto& v : res) { for (auto& num : v) { cout << num << " "; } cout << endl; } return ; } ``` 在上面的代码中,我们使用了一个二维向量 res 来记录每趟排序后的结果。在每次排序结束后,我们将当前的序列复制一份,并将其添加到 res 中。最后,我们按照递减输出 res 中的所有向量即可。 ### 回答2: 快速排序是一种分治算法,其基本思想是将一个序列分成两个子序列进行排序,以达到整体有的效果。在快速排序中,需要选择一个枢轴元素,在每一趟排序中,将比枢轴小的数放在枢轴左边,比枢轴大的数放在枢轴右边,然后进行递归调用,直到所有的子序列都有给定一个整数序列,按照递减输出采用快速排序各趟排序后的结果,可以采用递归。首先选择序列的第一个元素作为枢轴,把序列分成两个子序列,以枢轴为分界,左边的数都比枢轴小,右边的数都比枢轴大。然后对左右两个子序列分别进行递归调用,直到子序列只有一个元素或为空时停止。 下面来具体解释一下快速排序的步骤: 1. 选择枢轴:选择序列的第一个元素作为枢轴。 2. 划分序列:将序列分成两个子序列,左边的数都比枢轴小,右边的数都比枢轴大。 3. 递归排序左子序列:对左子序列进行递归排序。 4. 递归排序右子序列:对右子序列进行递归排序。 5. 合并序列:左子序列、枢轴、右子序列按顺合并成新的序列。 6. 重复执行以上步骤,直到所有子序列都有序列排序完成了。 以下是一个示例: 假设给定整数序列为:{5,8,3,4,6,9,1,7,2}。 第一趟排序: 选择枢轴5,划分序列为{3,4,1,2},5,{8,6,9,7}。 对左子序列{3,4,1,2}进行递归排序: 选择枢轴3,划分序列为{1,2},3,{4}。 左子序列{1,2}排序后为{1,2},右子序列{4}排序后为{4},合并后得到{1,2,3,4}。 对右子序列{8,6,9,7}进行递归排序: 选择枢轴8,划分序列为{6,7},8,{9}。 左子序列{6,7}排序后为{6,7},右子序列{9}排序后为{9},合并后得到{6,7,8,9}。 左子序列{1,2,3,4},右子序列{5},合并后得到{1,2,3,4,5}。 第一趟排序后的序列为{1,2,3,4,5,8,6,9,7}。 第二趟排序: 选择枢轴1,划分序列为{},1,{2,3,4,5,8,6,9,7}。 对左子序列{}进行递归排序,得到{}。 对右子序列{2,3,4,5,8,6,9,7}进行递归排序: 选择枢轴2,划分序列为{},2,{3,4,5,8,6,9,7}。 对左子序列{}进行递归排序,得到{}。 对右子序列{3,4,5,8,6,9,7}进行递归排序: 选择枢轴3,划分序列为{},3,{4,5,8,6,9,7}。 对左子序列{}进行递归排序,得到{}。 对右子序列{4,5,8,6,9,7}进行递归排序: 选择枢轴4,划分序列为{},4,{5,8,6,9,7}。 对左子序列{}进行递归排序,得到{}。 对右子序列{5,8,6,9,7}进行递归排序: 选择枢轴5,划分序列为{},5,{8,6,9,7}。 对左子序列{}进行递归排序,得到{}。 对右子序列{8,6,9,7}进行递归排序: 选择枢轴8,划分序列为{6,7},8,{9}。 左子序列{6,7}排序后为{6,7},右子序列{9}排序后为{9},合并后得到{6,7,8,9}。 左子序列{},右子序列{6,7,8,9},合并后得到{6,7,8,9}。 左子序列{},右子序列{},合并后得到{}。 第二趟排序后的序列为{1,2,3,4,5,6,7,8,9}。 经过两趟排序后,序列已经是递减的有序列了。 ### 回答3: 快速排序是一种高效的排序算法,其核心思想是通过不断地分区和递归,将问题规模不断缩小,从而达到排序的目的。在排序过程中,我们需要选定一个枢轴(支点)元素,将数组划分为比枢轴小的左侧部分和比枢轴大的右侧部分,然后递归地对左右两部分进行排序,直到左右两个部分都已有给定一个整数序列,我们可以通过快速排序递归)来实现递减排序。具体实现过程如下: 1. 选定一个枢轴元素,通常为序列的首元素,记为pivot。 2. 定义两个指针i和j,分别指向序列的左右两端。 3. 从右向左扫描数组,找到第一个比pivot小的元素,将其与i指向的元素交换。 4. 从左向右扫描数组,找到第一个比pivot大的元素,将其与j指向的元素交换。 5. 重复3和4,直到i>=j退出循环。此时,i指向的位置即为pivot在排序后的位置。 6. 递归地对左右两部分分别进行快速排序。 通过以上步骤,我们可以得到每趟排序后的结果,即每次选定的pivot的位置。在实际的排序中,我们需要意一些细节问题,例如如何选定pivot、如何避免出现死循环等等。但总的来说,快速排序是一种常优秀的排序算法,其平均时间复杂度为O(nlogn),尤其在处理大数据集时表现突出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值