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排序

    主要思想:

  • 相关阅读:
    MIME 部分扩展名与类型对应
    sql server 表变量、表类型、临时表
    SqlBulkCopy使用注意事项
    SQL Server为啥使用了这么多内存?
    SQL SERVER下有序GUID和无序GUID作为主键&聚集索引的性能表现
    DQL、DML、DDL、DCL的概念与区别
    IIS解决CPU和内存占用率过高的问题
    SQL Server 表变量和临时表的区别
    I Count Two Three(打表+排序+二分查找)
    AC自动机入门经典题目(两种表达方式)
  • 原文地址:https://www.cnblogs.com/sherPur/p/4596445.html
Copyright © 2011-2022 走看看