zoukankan      html  css  js  c++  java
  • 数据结构--排序

    专题--排序

    1. 冒泡排序(O(n2))

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 //降序排
     5 void swap(int &a,int &b)
     6 {
     7     int temp=a;
     8     a=b;
     9     b=temp;
    10 }
    11 
    12 //冒泡排序
    13 //版本A
    14 void BubbleSort(vector<int> &mvec)
    15 {
    16     int len=mvec.size();
    17     for(int i=0;i<len-1;++i)
    18     {
    19         for(int j=i+1;j<len;++j)
    20         {
    21             if(mvec[i]<mvec[j])
    22                 swap(mvec[i],mvec[j]);
    23         }
    24     }
    25 }
    26 //版本B:注意j从后向前循环
    27 void BubbleSort1(vector<int> &mvec)
    28 {
    29     int len=mvec.size();
    30     for(int i=0;i<len;++i)
    31     {
    32         for(int j=len-1;j>i;--j)  //从后向前
    33         {
    34             if(mvec[j-1]<mvec[j])
    35                 swap(mvec[j-1],mvec[j]);
    36         }
    37     }
    38 }
    39 //版本C:避免不必要的循环
    40 void BubbleSort2(vector<int> &mvec)
    41 {
    42     bool flag=true;  //
    43     int len=mvec.size();
    44     for(int i=0;i<len&&flag;++i)
    45     {
    46         flag=false;
    47         for(int j=len-1;j>i;--j) //从后向前
    48         {
    49             if(mvec[j-1]<mvec[j])
    50             {
    51                 flag=true;
    52                 swap(mvec[j-1],mvec[j]);
    53             }
    54         }
    55     }
    56 }
    57 
    58 int main()
    59 {
    60     vector<int> mvec{0,5,4,7,3,6,2,1,8,9};
    61     BubbleSort2(mvec);
    62     for(auto &mem:mvec)
    63         cout<<mem<<" ";
    64     cout<<endl;
    65     return 0;
    66 }

    2. 简单选择排序(O(n2))

     1 //简单选择排序
     2 void SelectSort(vector<int> &mvec)
     3 {
     4     int len=mvec.size();
     5     for(int i=0;i<len-1;++i)
     6     {
     7         int maxI=i;       //用于记录
     8         for(int j=i+1;j<len;++j)
     9         {
    10             if(mvec[maxI]<mvec[j])
    11                 maxI=j;  //暂时不交换
    12         }
    13         if(maxI!=i)
    14             swap(mvec[maxI],mvec[i]);
    15     }
    16 }
    17 
    18 
    19 int main()
    20 {
    21     vector<int> mvec{0,5,4,7,3,6,2,1,8,9};
    22     //BubbleSort2(mvec);
    23     SelectSort(mvec);
    24     for(auto &mem:mvec)
    25         cout<<mem<<" ";
    26     cout<<endl;
    27     return 0;
    28 }

    3. 直接插入排序(O(n2))

      注意:不需要调用swap(),适用于“记录少,基本有序的情况”。

     1 //直接插入排序
     2 void InsertSort(vector<int> &mvec)
     3 {
     4     int len=mvec.size();
     5     for(int i=1;i<len;++i)     //从i=1开始:假设mvec[0]有序
     6     {
     7         if(mvec[i-1]<mvec[i])
     8         {
     9             int temp=mvec[i];  //记录mvec[i],找到正确位置插入
    10             int j;
    11             for(j=i-1;mvec[j]<temp;--j)  //从后向前
    12                 mvec[j+1]=mvec[j];  //将有序子表后移
    13             mvec[j+1]=temp;    //插入到正确位置
    14         }
    15     }
    16 }
    17 
    18 int main()
    19 {
    20     vector<int> mvec{0,5,4,7,3,6,2,1,8,9};
    21     //BubbleSort2(mvec);
    22     //SelectSort(mvec);
    23     InsertSort(mvec);
    24     for(auto &mem:mvec)
    25         cout<<mem<<" ";
    26     cout<<endl;
    27     return 0;
    28 }

     4. 堆排序和快速排序

     1 //堆排序:注意:不计mvec[0]
     2 //已知记录mvec中中的关键字除mvec[s]之外均满足堆的定义
     3 void HeapAdjust(vector<int> &mvec,int s,int m)
     4 {
     5     int temp=mvec[s];
     6     for(int j=2*s;j<=m;j*=2)
     7     {
     8         if(j<m && mvec[j]<mvec[j+1])  //右孩子大
     9             ++j;     //j为关键字中较大的记录的下标
    10         if(temp>=mvec[j])
    11             break;
    12         mvec[s]=mvec[j];
    13         s=j;
    14     }
    15     mvec[s]=temp;   //插入
    16 }
    17 void HeapSort(vector<int> &mvec)
    18 {
    19     int len=mvec.size()-1;
    20     for(int i=len/2;i>0;--i)
    21     {
    22         HeapAdjust(mvec,i,len);
    23     }
    24     for(int i=len;i>1;--i)
    25     {
    26         swap(mvec[1],mvec[i]);
    27         HeapAdjust(mvec,1,i-1);
    28     }
    29 }
    30 //快速排序
    31 int Partition(vector<int> &mvec,int lo,int hi)
    32 {
    33     int pikey=mvec[lo];
    34     while(lo<hi)
    35     {
    36         while(lo<hi && mvec[hi]<=pikey)
    37             --hi;
    38         swap(mvec[lo],mvec[hi]);
    39         while(lo<hi && mvec[lo]>=pikey)
    40             ++lo;
    41         swap(mvec[lo],mvec[hi]);
    42     }
    43     return lo;  //最终lo和hi值相等;mvec[lo]==mvec[hi]==pikey
    44 }
    45 void QSort(vector<int> &mvec,int lo,int hi)
    46 {
    47     if(lo<hi)
    48     {
    49         int pi=Partition(mvec,lo,hi); //已将mvec[pi]放到合适位置
    50 
    51         QSort(mvec,lo,pi-1);
    52         QSort(mvec,pi+1,hi);
    53     }
    54 }
    55 //快排主函数
    56 void QuikSort(vector<int> &mvec)
    57 {
    58     int len=mvec.size()-1;  //注意 hi=mvec.size()-1
    59     QSort(mvec,0,len);
    60 }
    61 
    62 
    63 int main()
    64 {
    65     vector<int> mvec{9,5,4,7,3,6,2,1,0,8};
    66     //BubbleSort2(mvec);
    67     //SelectSort(mvec);
    68     //InsertSort(mvec);
    69     //HeapSort(mvec);
    70     QuikSort(mvec);
    71     for(auto &mem:mvec)
    72         cout<<mem<<" ";
    73     cout<<endl;
    74     return 0;
    75 }
  • 相关阅读:
    Seaborn相关
    Matplot相关(二)——统计图
    PAT 甲级真题
    数学题一
    Codeforces Round #467 (Div. 2)
    国庆 Day1
    [NOIP 2005] 运输计划
    dp专题练习
    YBT 2.4 AC自动机
    [模板]树链剖分
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/7159281.html
Copyright © 2011-2022 走看看