第九章 排序

目录

7-1 数据结构实验五 快速排序

7-2 数据结构实验五 直接插入排序

7-3 快速排序

7-4 排序与查找

7-5 字符串排序--string类的使用

7-6 成绩排序

7-7 冒泡排序练习

7-8 sdut-C语言实验- 冒泡排序中数据交换的次数

7-9 选择排序

7-10 插入排序


7-1 数据结构实验五 快速排序

#include "stdio.h"
#define MAXSIZE 50     // MAXSIZE为最大数据元素数目
typedef int ElemType;
typedef  struct
{
    ElemType  data[MAXSIZE +1];    // r[0]闲置或另作它用
    int  length;
}SqList;
void sort(SqList *sqList,int left,int right)
{
//    printf("%d %d\n",left,right);
    if(left>=right) return;

    int flag = sqList->data[left];
    int l=left,r=right;
    while (l<r){
        while (l<r && sqList->data[r]>=flag) r--;
        while (l<r && sqList->data[l]<=flag) l++;
        if(l>=r) break;
        ElemType key = sqList->data[r];
        sqList->data[r] = sqList->data[l];
        sqList->data[l] = key;
    }
    sqList->data[left] = sqList->data[r];
    sqList->data[r] = flag;
    sort(sqList,left,l-1);
    sort(sqList,l+1,right);
}

int main(){
    SqList sqList;
    scanf("%d",&sqList.length);
    for(int z=1;z<=sqList.length;z++) scanf("%d",&sqList.data[z]);
    sort(&sqList,1,sqList.length);
    if(sqList.length){
        printf("%d",sqList.data[1]);
        for(int z=2;z<=sqList.length;z++) printf(" %d",sqList.data[z]);
    }
    return 0;
}


7-2 数据结构实验五 直接插入排序

#include "stdio.h"
#define MAXSIZE 50     // MAXSIZE为最大数据元素数目
typedef int ElemType;
typedef  struct
{
    ElemType  data[MAXSIZE +1];    // r[0]闲置或另作它用
    int  length;
}SqList;


int main(){
    SqList sqList;
    scanf("%d",&sqList.length);
    for(int z=1;z<=sqList.length;z++) scanf("%d",&sqList.data[z]);
    for(int z=2;z<=sqList.length;z++){
        int flag = z;
        while (flag>1 && sqList.data[flag]<sqList.data[flag-1]) {
            ElemType temp = sqList.data[flag];
            sqList.data[flag] = sqList.data[flag-1];
            sqList.data[--flag] = temp;
        }
    }
    if(sqList.length){
        printf("%d",sqList.data[1]);
        for(int z=2;z<=sqList.length;z++) printf(" %d",sqList.data[z]);
    }
    return 0;
}


7-3 快速排序

#include "stdio.h"
#define MAXSIZE 100     // MAXSIZE为最大数据元素数目
typedef int ElemType;
typedef  struct
{
    ElemType  data[MAXSIZE +1];    // r[0]闲置或另作它用
    int  length;
}SqList;
void sort(ElemType *data,int left,int right,int length)
{
//    printf("%d %d\n",left,right);
    if(left>=right) return;
    
    int l=left,r=right,op=0;
    while (l<r){
        if(data[l]>data[r]){
            int temp = data[l];
            data[l] = data[r];
            data[r] = temp;
            op = op==0? 1 : 0;
            continue;
        }
        op ? l++ : r--;
    }

    printf("%d", data[1]);
    for (int z = 2; z <= length; z++) printf(" %d", data[z]);

    puts("");
    sort(data,left,l-1,length);
    sort(data,l+1,right,length);
}

int main()
{
    SqList sqList;
    int complete;
    while ( scanf("%d",&sqList.length)!=EOF){
        for(int z=1;z<=sqList.length;z++) scanf("%d",&sqList.data[z]);
        sort(sqList.data,1,sqList.length,sqList.length);
    }
    return 0;
}

7-4 排序与查找

#include<stdio.h>
int findIndex(int *nums,int N,int K){
    int l=1,r=N;
    while (l<=r){
        int mid = (r+l)/2;
        if(nums[mid]==K) return mid;
        if(nums[mid]<K) l = mid+1;
        else r = mid-1;
    }
    return 0;
}
int main()
{
    int nums[101],N,M,K;
    while (scanf("%d",&N)!=EOF){
        for(int z=1;z<=N;z++) scanf("%d",&nums[z]);
        for(int z=1;z<N;z++){
            for(int z1=1;z1<=N-z;z1++){
                if(nums[z1]>nums[z1+1]){
                    nums[z1+1]^=nums[z1]^=nums[z1+1]^=nums[z1];
                }
            }
        }
        printf("%d",nums[1]);
        for(int z=2;z<=N;z++) printf(" %d",nums[z]);
        putchar('\n');
        scanf("%d",&M);
        while (M--){
            scanf("%d",&K);
            printf("%d", findIndex(nums,N,K));
            putchar((M==0?'\n':' '));
        }
    }
    return 0;
}

7-5 字符串排序--string类的使用

#include<stdio.h>
#include<string.h>
char str[2022][1205];
int main()
{
    int N;
    while (scanf("%d\n",&N)!=EOF){
        for(int z=1;z<=N;z++){
            gets(str[z]);
            if(strcmp(str[z],"stop")==0){
                N = z-1;
                break;
            }
        }
        for(int z=1;z<=N;z++){
            int key = 1;
            for(int z1=1;z1<=N;z1++){
                if(strlen(str[z1])<strlen(str[key])) {
                    key = z1;
                }
            }
            puts(str[key]);
            strcpy(str[key],"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
        }

    }


    return 0;
}

7-6 成绩排序

#include<stdio.h>
#include<string.h>
struct Student{
    char name[2022];
    int score,apr;
}s[101];

int cmp(int x,int y){
    if(s[x].score!=s[y].score) return s[x].score < s[y].score;
    return strcmp(s[x].name,s[y].name) > 0;
}

int main(){

    int N;
    scanf("%d",&N);
    for(int z=0;z<N;z++) {
        scanf("%s %d",&s[z].name,&s[z].score);
        s[z].apr = 0;
    }
    for(int z=0;z<N;z++){
        int flag = 0;
        while (s[flag].apr) flag++;
        for(int z1=flag+1;z1<N;z1++){
            if(!s[z1].apr && cmp(flag,z1)){
                flag = z1;
            }
        }
        s[flag].apr = 1;
        printf("%s %d\n",s[flag].name,s[flag].score);
    }


    return 0;
}

7-7 冒泡排序练习

#include<stdio.h>
int main()
{
    int nums[101],N,K;
    while(scanf("%d %d",&N,&K)!=EOF){
        for(int z=0;z<N;z++) scanf("%d",&nums[z]);
        for(int z=1;z<=K;z++){
            for(int z1=0;z1<N-z;z1++){
                if(nums[z1]>nums[z1+1]){
                    nums[z1] ^= nums[z1+1] ^= nums[z1] ^= nums[z1+1];
                }
            }
        }
        printf("%d",nums[0]);
        for(int z=1;z<N;z++) printf(" %d",nums[z]);
        putchar('\n');
    }
    
    
    return 0;
}

7-8 sdut-C语言实验- 冒泡排序中数据交换的次数

#include<stdio.h>
int main()
{
    int nums[101],N;
    scanf("%d",&N);
    while(N--){
        int result = 0,M;
        scanf("%d",&M);
        for(int z=0;z<M;z++) scanf("%d",&nums[z]);
        for(int z=1;z<=M;z++){
            for(int z1=0;z1<M-z;z1++){
                if(nums[z1]>nums[z1+1]){
                    nums[z1] ^= nums[z1+1] ^= nums[z1] ^= nums[z1+1];
                    result++;
                }
            }
        }
        printf("%d\n",result);
    }

    return 0;
}

7-9 选择排序
 

#include<stdio.h>
int main()
{
    int nums[1000001],N;
    scanf("%d",&N);
    for(int z=0;z<N;z++) scanf("%d",&nums[z]);
    for(int z=0;z<N-1;z++){
        int index = z;
        for(int z1=z;z1<N;z1++){
            if(nums[z1]<nums[index]){
                index = z1;
            }
        }
        if(z!=index) nums[z]^=nums[index]^=nums[z]^=nums[index];
        printf("step %d: ",z+1);
        for(int z1=0;z1<N;z1++) printf("%d ",nums[z1]);
        putchar('\n');
    }
    printf("sorted array: ");
    for(int z=0;z<N;z++) printf("%d ",nums[z]);
    return 0;
}

7-10 插入排序

#include<stdio.h>
void print(int *nums,int N){
    printf("%d",nums[0]);
    for(int z=1;z<N;z++) printf(" %d",nums[z]);
    putchar('\n');
}
int main()
{
    int nums[10001],N;
    scanf("%d",&N);
    for(int z=0;z<N;z++) scanf("%d",&nums[z]);
//    print(nums,N);
    for(int z=1;z<N;z++){
        int key = z;
        while (key>0 && nums[key]<nums[key-1]){
            int temp = nums[key];
            nums[key] = nums[key-1];
            nums[--key] = temp;
        }
        print(nums,N);
    }

    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三块不一样的石头

十分满意,一分打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值