• 排序小结


    在做很多题目时都会用到排序,先把我遇到过的排序整理一下

    冒泡排序:

    接触的第一种排序方法

    从第一个元素起,开始两两比较,结束之后,最大的数在数组的末尾

    一共需要比较n-1次,外循环为n-1,内循环次数随外循环改变,n-1-i

    #include<stdio.h>
    int main()
    {
        int a[1001];
        int i,j,n,t;
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(i=1;i<=n-1;i++)
            for(j=0;j<=n-i-1;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
        for(i=0;i<n;i++)
        printf("%d ",a[i]);
        return 0;
    }

    选择排序:

    将最小的数放在前面,然后将a[0]与a[1]比较,由小到大排序,将a[1]与a[2]比较,从小到大排序,……,将a[n]与a[n-1]比较,从小到大排序;再从剩余的n-1个数中选择最小的放在a[1]的位置,以此类推。

    #include<stdio.h>
    int main()
    {
        int a[1001];
        int i,j,n,t;
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(i=0;i<n-1;i++)
            for(j=i+1;j<n;j++)
        {
            if(a[i]>a[j])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
        for(i=0;i<n;i++)
        printf("%d ",a[i]);
        return 0;
    }

    简化版桶排序:

    这只是可以满足比较简单的排序的简化版

    依次判断桶的编号,出现了几次就打印几次。每出现一个数,对应编号的桶+1

    #include<stdio.h>
    int main()
    {
        int a[1001];
        int i,j,t,n;
        for(i=0;i<1000;i++)
            a[i]=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&t);
            a[t]++;
        }
        for(i=1;i<1000;i++)
            for(j=1;j<=a[i];j++)
            printf("%d ",i);
        return 0;
    }

    快速排序:

    设置一个基准数,将比基准数小的数放左边,比基准数大的数放在其右边

    #include<stdio.h>
    int a[101],n;
    void quicksort(int left,int right)
    {
        int i,j,temp,t;
        if(left>right)
            return ;
            temp=a[left];
            i=left;
            j=right;
        while(i!=j)
        {
            while(a[j]>=temp&&i<j)
                j--;
            while(a[i]<=temp&&i<j)
            i++;
            if(i<j)
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
        a[left]=a[i];
        a[i]=temp;
        quicksort(left,i-1);
        quicksort(i+1,right);
    }
    int main()
    {
        int i;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
        quicksort(1,n);
        for(i=1;i<=n;i++)
            printf("%d ",a[i]);
        return 0;
    }

    冒泡排序是将最大的数先放后面;选择排序是将最小的数先放前面;简化版桶排序是每出现一个数,就将对应编号的桶内+1;快速排序需要设置基准点

  • 相关阅读:
    SpringBoot异步处理请求
    5本最佳的 Java 面向对象理论和设计模式的书籍
    彻底弄懂 HTTP 缓存机制 —— 基于缓存策略三要素分解法
    Java 性能优化的五大技巧
    Java 8 最佳技巧
    Java 并发的四种风味:Thread、Executor、ForkJoin 和 Actor
    在 Java 8 中避免 Null 检查
    关于创建java线程池问题的思考
    LuoguP1858 多人背包(DP)
    Luogu[YNOI2019]排序(DP,线段树)
  • 原文地址:https://www.cnblogs.com/AquamarineOnly/p/5587870.html
Copyright © 2020-2023  润新知