• 排序


    一、插入排序

    1、直接插入排序

    2、希尔排序

    二、选择排序

    1、简单选择排序

    2、堆排序

    三、交换排序

    1、冒泡排序(Bubble Sort)

          对一个有n个数的序列,进行(n-1)次扫描,每次扫描都比较相邻的两个元素大小,若顺序错误,则将两个元素交换,这样每次扫描都会得到正确排序的最后一位元素。

    比如:3 2 1

    第一次扫描:3 2 1-->2 3 1      2 3 1-->2 1 3

    第二次扫描:2 1 3-->1 2 3

    void bubblesort(int a[],int n)
    {
        for(int j=0;j<n-1;j++)//进行(n-1)次扫描
            for(int i=0;i<n-1-j;i++)//对序列扫描
            {
                if(a[i]>a[i+1])//若错误排序,则交换
                {
                    int temp=a[i];
                    a[i]=a[i+1];
                    a[i+1]=temp;
                }
        }
    }

    2、快速排序

        快排是对冒泡排序的一种改进,它的思想是选取一个关键数据(key),经过一趟排序,把要排序的数据分成独立的两部分,一部分全部小于或等于关键数据,一部分大于等于关键数据,然后按此方法对这两部分进行快排,整个过程用递归实现,以此达到整个数据有序。关键数据(key)可以在数据中仍选一个,但一般选第一个数据。

        快速排序可以分为以下几步:

        1) 设置两个变量first、last分别指向需要快排的首部(low)和尾部(high);

        2)以第一个数据为关键数据,key=a[first];

        3)从后面开始搜素(last--),找到第一个小于key的数据,并且将它赋值给a[first],即a[first]=a[last];

        4) 从前面开始搜素(first++),找到第一个大于key的数据,并且将它赋值给a[last],即a[last]=a[first];

        5) 重复3、4步,直到前面的数据都小于key,后面的数据都大于key,即first=last;然后把关键数据放到序列中,既a[first]=key;

        6)分别将关键数据的前部分和后部分进行1~5步,又可以将前部分和后部分别分为两部分,然后继续进行1~5步操作,以此继续下去,直到序列排好序,这样就可以用到递归实现了。

        例如原序列:3 8 2 4 5 7 1 6

        key=3, 3 8 2 4 5 7 1  首先将3作为关键数据,用first、last分别指向序列的首部和尾部,把小于3和大于3的元素分开,首先比较3和6,6>3,last左移;

        key=3, 3 8 2 4 5 7 1 6  比较3和1,1<3,把1放到左边,即a[first]=a[last];然后从左边开始;

        key=3, 1 8 2 4 5 7 1 6  比较8和3,8>3,把8移到右边,即a[last]=a[first],又从右边开始比较;

        key=3, 1 8 2 4 5 7 8 6  7、5、4>3,直到last移到2(2<3)的位置,再从左边开始,以此下去,直到first=last;

        key=3, 1 2 2 4 5 7 8 6  把key放到序列中,即a[firsrt]=key;变成如下序列;

                1 2 3 4 5 7 8 6

       之后把2的左边和右边分别进行快排,需要进行递归调用,最终生成最后的结果。

    代码如下:

    void quicksort(int a[],int low,int high)//进行快排的数组,以及需进行快排的首尾地址
    {
        if(low>=high)//递归结束条件
            return ;
        int first=low;
        int last=high;
        int key=a[first];
        while(first<last)//快排过程
        {
            while(first<last && a[last]>=key)
                last--;
            a[first]=a[last];
            while(first<last && a[first]<=key)
                first++;
            a[last]=a[first];
        }
        a[first]=key;//将关键数据放到原序列中
        quicksort(a,low,first-1);//左边快排,递归进行
        quicksort(a,first+1,high);//右边快排,递归进行
    }

    四、归并排序

    五、基数排序

  • 相关阅读:
    [linux]在使用rsync时需要注意的小细节
    [日期工具分享][Shell]为特定命令依次传入顺序日期执行
    【API】反转输入字符(Java)
    【笔记】对自定义异常的理解(Java)
    【技巧】解决win10的1803版本下,无法收到1809推送、从而无法更新到1903版本的问题。
    【杂谈】5G有啥用?跟咱有关系么?关注那玩意儿干啥?
    【练习总结】题目:筛法遍历素数(Java)
    【练习】Java实现的杨辉三角形控制台输出
    windows系列的(xp/win7/server2003/2008/2012...)完美移植到centos7下面的虚拟机(KVM)
    模块之-os模块
  • 原文地址:https://www.cnblogs.com/mgxj/p/4163119.html
Copyright © 2020-2023  润新知