数据结构与算法作业8:排序算法的应用

举报
nimo的小舔狗 发表于 2022/05/11 01:36:39 2022/05/11
【摘要】 设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红,白,蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石居后,重新安排时对每粒砾石的颜色只能看一次,并且只允许交换操作来调整砾石的位置。 提示: 利用快速排序思想解决。由于要求“对每粒砾石的颜色只能看一次”,设3个指针i,j和k...

设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红,白,蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石居后,重新安排时对每粒砾石的颜色只能看一次,并且只允许交换操作来调整砾石的位置。

提示:


利用快速排序思想解决。由于要求“对每粒砾石的颜色只能看一次”,设3个指针i,j和k,若将j看作工作指针,将r[1..j-1]作为红色,r[j..k-1]为白色,r[k..n]为兰色。从j=1开始查看,若r[j]为白色,则j=j+1;若r[j]为红色,则交换r[j]与r[i],且j=j+1,i=i+1;若r[j]为兰色,则交换r[j]与r[k];k=k-1。算法进行到j>k为止。

为方便处理,将三种砾石的颜色用整数1、2和3表示。

预设代码

后置代码

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */



int main() {

int n;

cin >> n; 

int * a= new int[n];

for (int i=0;i<n;i++)

cin>>a[i];

Sort(a,n);

}



/* PRESET CODE END - NEVER TOUCH CODE ABOVE */

前置代码

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */



#include "assert.h"

#include <iostream>

using namespace std;





/* PRESET CODE END - NEVER TOUCH CODE ABOVE */

例如:

输入 Result
6 1 2 3 3 2 1
2<--->5
1<--->2
3<--->4
112233

答案: 

void Sort(int a[],int n){
    int i=0,j=0,k=n-1,temp;
    while(k>=j){
        if(a[j]==1){
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            if(i!=j)
            cout<<i<<"<--->"<<j<<endl;
            i++;j++;
            }
        else if(a[j]==2) j++;
        else{
            temp=a[j];
            a[j]=a[k];
            a[k]=temp;
            if(k!=j)
            cout<<j<<"<--->"<<k<<endl;
            k--;
        }
    }
    for(i=0;i<n;i++){
        cout<<a[i];
    }
        
}





 

文章来源: blog.csdn.net,作者:渣渣ye,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/yyfloveqcw/article/details/123760759

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。