zoukankan      html  css  js  c++  java
  • 排序算法分析与实现

    主要参考算法导论,以及网上相关资料,相关参考会贴链接。

     

    稳定性

    时间分析

    空间分析

    最好

    最差

    平均

    气泡排序

    稳定排序

    O(n)

    O(n2)

    O(n2)

    O(1)

    插入排序

    稳定排序

    O(n)

    O(n2)

    O(n2)

    O(1)

    选择排序

    不稳定

    O(n2)

    O(n2)

    O(n2)

    O(1)

    归并排序

    稳定排序

    O(nlogn)

    O(nlogn)

    O(nlogn)

    O(n)

    桶排序

    稳定排序

    O(n)

     

     

    O(k)

    基数排序

    稳定排序

    O(d(n+r))

    O(d(n+r))

    O(d(n+r))

    O(n+r)

    希尔排序

    不稳定

    O(nlogn)

    O(nlogn)

    O(nlogn)

    O(1)

    堆排序

    不稳定

    O(nlogn)

    O(nlogn)

    O(nlogn)

    O(1)

    快速排序

    不稳地

    O(nlogn)

    O(n2)

    O(nlogn)

    O(logn)

     

     1.冒泡排序

    主要思想:冒泡排序通过从前向后(或从后向前)相邻两个元素一次比较,然后根据大小交换位置,按照既定的降序或升序规则确定最后浮出的元素。

    代码实现:

     1 void BubbleSort(int A[],int n){
     2  //用冒泡排序法将序列A中的元素从小到大排列
     3  for(int i=0;i<n-1;i++){
     4      bool flag=false; //表示本趟是否发生交换的标志
     5      for(int j=n-1;j>i;j--){
     6          if(A[j-1]>A[j]){
     7             int temp=A[j-1];
     8             A[j-1]=A[j];
     9             A[j]=temp;
    10             flag=true;
    11          }
    12      } 
    13      if (flag==false)
    14         return;
    15  }
    16 }

    2.插入排序

    主要思想:将数据分为两部分,一部分已经是有序,另一部分乱序,依次从乱序部分取出一个元素,与有序部分中的元素比较,最后放在合适位置。

    代码实现:

     1 void InsertSort(int A[],int n){
     2     int i,j;
     3     for(i=2;i<n;i++){ //依次将A[2]~A[n]插入前面已经排好的序列
     4         if(A[i]<A[i-1]){
     5             int temp=A[i];
     6             for(j=i-1;temp<A[j]&&j!=0;j--)
     7                 A[j+1]=A[j];   //向后挪位
     8             A[j+1]=temp;       //复制到插入位置
     9         }
    10     }
    11 }

    3.选择排序

    主要思想:将乱序部分的元素比较,取出最小(最大)元素,重复该操作直至所有元素都有序排列

    代码实现

     1 void SelectSort(int A[],int n){
     2 //将数组A做简单选择排序,A[]从0开始存放元素
     3     for(int i=0;i<n;i++){
     4         int index=i;
     5         for(int j=i+1;j<n;j++){
     6             if(A[j]<A[index]) 
     7                 index=j;
     8         }
     9         if(index!=i) swap(A[i],A[index]);
    10     }
    11 }

    4.归并排序

    主要思想:分而治之的思想,利用递归将待排元素划分为一个个的元素,然后两两归并,归并后的小数组继续两两归并知道大数组完全有序。大概过程如下如所示

     

     

    代码实现:

     

     

     1 //Merge()的功能是将前后相邻的两个有序表归并为一个有序表
     2 void Merge(int A[],int low,int mid,int high,int temp[]){
     3     int k,i,j;
     4     for( k=low;k<=high;k++)
     5         temp[k]=A[k];
     6     for( i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){
     7         if(temp[i]<temp[j])
     8             A[k]=temp[i++];
     9         else
    10             A[k]=temp[j++];
    11     }
    12     while(i<=mid) A[k++]=temp[i++];
    13     while(j<=high) A[k++]=temp[j++];
    14 }
    15 
    16 void MergeSort(int A[],int low,int high,int temp[]){
    17 
    18     if(low<high){
    19         int mid=(low+high)/2;//从中间划分两个子序列
    20         MergeSort(A,low,mid,temp); //对左侧子序列递归排序
    21         MergeSort(A,mid+1,high,temp);  //对右侧子序列递归排序
    22         Merge(A,low,mid,high,temp);  //归并
    23     }
    24 }

    5.Shell排序

    主要思想:

  • 相关阅读:
    HDU 3833 YY's new problem ()
    从文件读入16进制数转化为10进制数再输出到文件中
    UESTC 1215 (思维题 旋转)
    HDU2067卡特兰数
    HDU2050离散数学折线分割平面
    cshell学习
    C++学习1
    QT学习1
    QT Creator常用快捷键
    Ubuntu14.04安装QT5.5
  • 原文地址:https://www.cnblogs.com/sherPur/p/4596445.html
Copyright © 2011-2022 走看看