zoukankan      html  css  js  c++  java
  • 七大排序

    **********

     交换排序

    **********

    1.冒泡排序

    思想:

    n-1轮交换操作,交换是相邻项交换,一轮遍历就在最后面

    成功交换出来一个最值了,后面得到的最值在下一轮中就不用管了。

    #include <iostream>

    using namespace std;

    int main()

    {

    int a[10]={2,1,4,6,4,7,9,8,3,5};

    for(int i=0;i<9;i++)                   //需要交换的轮数    

            {

         for(int j=0;j<10-1-i;j++)       //从数组起始一直到已经交换出的数为止, 

             {                     //涉及到j+1,只需要到“当前末位置”前一个

              if(a[j]>a[j+1])            

                  {

                      int t=a[i];a[i]=a[j];a[j]=t;

        }

    }      

    }

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

       cout<<a[i]<<' ';

    cout<<endl;

    }

    2.快速排序

    思想:

    left位置取数作为基准(base)参照物,

    从数组的right位置向前找,一直找到比(base)小的数,如果找到,将此数赋给left位置,

    从数组的left位置向后找,一直找到比(base)大的数,如果找到,将此数赋给right的位置,

    重复“第二,第三“步骤,直到leftright指针重合,最后将(base)插入到指针重合的位置,

    第一遍的遍历完成(让leftright指针重合),数组出现切割点(切割点一边的数全小于分割点,一边全大于)

    然后对分割点两边继续进行分割,递归操作直到不能分割,排序完成。

    代码实现:

    递归操作,递归出口是数组左右指针重合;

    充分利用了while循环的好处。

    #include <iostream>

    using namespace std;

    void quicksort(int a[],int low,int high)       //lowhigh参数指数组需要排列的首项和尾项

    {

    if(low<high)                              //递归条件(出口)                

       {

            int i=low,j=high,temp=a[i];

            while(i<j)                        //操作出口条件

                {

                 while(a[j]>=a[i]&&j>i)    //右指针左移动直到能赋值

                     j--;

                    a[i]=a[j];

                    while(a[i]<=a[j]&&i<j)    //左指针右移动直到能赋值

                        i++;

                    a[j]=a[i];

    }

    a[i]=temp;                      //一轮遍历完成,i==j,赋基准值。

    quicksort(a,low,i-1);           //对分割点前面数据进行递归操作

    quicksort(a,i+1,high);          //对分割点后面数据进行递归操作

       }

    else return;

    }

    int main()

    {

    int a[10]={2,1,4,6,4,7,9,8,3,5};

    quicksort(a,0,9);

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

       cout<<a[i]<<' ';

    cout<<endl;

    }

    **********

     选择排序

    **********

    不断找最值,直到完成排序。

    对求前K大问题很好。

    3.直接选择排序

    思想:

    对前n-1个数进行操作,

    与他后面所有的数进行比较,比他大或者小就交换。

    相当于每次找最值置于最前面。

    #include <iostream>

    using namespace std;

    int main()

    {

    int a[10]={2,1,4,6,4,7,9,8,3,5};

    for(int i=0;i<9;i++)                    //需要交换的数,只要到倒数第二个

        {

         for(int j=i+1;j<10;j++)         // 需要交换的数后面开始一直到最后

             {

              if(a[i]>a[j])            

                 {

                      int t=a[i];a[i]=a[j];a[j]=t;

       }

    }      

    }

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

       cout<<a[i]<<' ';

    cout<<endl;

    }

    4.堆排序

    要知道堆排序,首先要了解一下二叉树的模型。

    那么要实现堆排序,必须要做两件事情:

    第一:构建大根堆。

    第二:输出大根堆。

    **********

    其他排序

    **********

    5.插入排序:

      直接插入和折半插入

    6.希尔排序

    7.归并排序

    ps: 插入排序的时间复杂度为:O(N^2)

         希尔排序的时间复杂度为:平均为:O(N^3/2)

                                           最坏: O(N^2)

         归并排序时间复杂度为: O(NlogN)

                  空间复杂度为:  O(N) 

  • 相关阅读:
    选择最佳服务台方案的7个考量
    使用OpManager轻松进行Windows网络监控
    统一终端管理(UEM)有哪些关键的安全功能
    javascript的声明变量var,let,const的区别
    Vue 在过滤器filter中调用methods中的方法
    第十六章:过滤器的奥秘
    1970年1月1日(00:00:00 GMT)Unix 时间戳(Unix Timestamp)
    让网页中的JavaScript代码自动执行的三种方法
    限制input type=“file“ 文件上传类型
    对v-html的文字做超出显示省略号
  • 原文地址:https://www.cnblogs.com/biggan/p/7382304.html
Copyright © 2011-2022 走看看