zoukankan      html  css  js  c++  java
  • 排序算法

    排序算法应该也是面试中会经常问到的问题。 /汗  现在就只会快速排序和归并排序。前两天看《算法导论》的堆排序,自己没能写出,代码都写出来了,就是通过不了测试,等过两天再写堆排序吧,今天先把快速排序和归并写了。嗯,而且要开始学 STL了,要不然笔试的时候算法都自己写,太耗时间了。

    各种排序算法的比较:  

    随机化快速排序:  时间复杂度O(nlogn)  递归树的高度logn    不稳定排序

    堆排序:     时间复杂度O(nlogn)    不稳定排序  ,可以用来实现优先队列  top K 数据的问题 

    归并排序:  时间复杂度O(nlogn)    稳定排序  

    基于比较模型的排序算法的时间复杂度的下届 O(nlogn)

    线性时间的排序算法O(n)   基数排序和桶排序  ,还没看,抽时间看一下 

    快速排序  时间复杂度平均为O(nlogn)  最差为O(n^2) 采用随机快速排序来避免这种情况

     1 int partition(int *arr,int lo,int hi)
     2 {
     3     //随机化的快速排序,避免O(n^2)
     4     swap(arr[lo],arr[lo+rand()%(hi-lo+1)]);
     5     int pivot = arr[lo];
     6     while(lo<hi)
     7     {
     8         while(lo<hi && arr[hi]>=pivot) 
     9             --hi;
    10         arr[lo] = arr[hi];
    11         
    12         while(lo<hi && arr[lo]<=pivot)
    13             ++lo;
    14         arr[hi] = arr[lo];
    15     }
    16     arr[lo] = pivot;
    17     return lo;
    18 }
    19 
    20 void QuickSort(int *arr,int lo,int hi)
    21 {
    22     if (!arr) return ;
    23     if (hi-lo <2)  return ;
    24     int mi = partition(arr,lo,hi-1);
    25     QuickSort(arr,lo,mi);
    26     QuickSort(arr,mi+1,hi);    
    27 }
    28 
    29 int main()
    30 {
    31     int arr[] = {3,4,6,-1,0};
    32     int n = sizeof(arr)/sizeof(int);
    33     QuickSort(arr,0,n);
    34     for (int i=0;i<n;i++)
    35     {
    36         cout<<arr[i]<<endl;
    37     }
    38     return 0;
    39 }

    归并排序   时间复杂度稳定在O(nlogn)

     1 void MergeSort(int arr[],int lo,int hi)
     2 {
     3     if (hi-lo<2)  return;
     4     int mi = (lo+hi)>>1;
     5     //以中点为界分别排序
     6     MergeSort(arr,lo,mi);  
     7     MergeSort(arr,mi,hi);
     8     Merge(arr,lo,mi,hi);
     9 }
    10 
    11 void Merge(int arr[],int lo,int mi,int hi)
    12 {
    13     int *A = arr + lo; 
    14     int lb = mi-lo;
    15     int *B = new int [lb];   //前子向量
    16     for (int i=0;i<lb;B[i++]=A[i++]); //复制前子向量
    17     int lc = hi-mi;
    18     int *C = arr + mi;      //后子向量
    19     for (int i=0,j=0,k=0;(j<lb) || (k<lc))
    20     {
    21         //加B
    22         if ((j<lb) && (!(k<lc)||B[j]<=C[k]))  A[i++] = B[j++];
    23         //加C
    24         if ((k<lc) && (!(j<lb)||B[j]> C[k]))  A[i++] = C[k++];        
    25     }
    26     delete []B;
    27 }

    先给堆排序留个坑,最大堆,最小堆,优先队列

    好吧,今天下午把堆排序写了,上代码

     1 #include <IOSTREAM>
     2 using namespace  std;
     3 
     4 //从0开始计算 left=2*i+1  right=2*i+2  parent=(i-1)/2
     5 //最开始考虑到运行效率,写成了(i-1)>>1,i<<1+2,i<<1+1 
     6 //忽略了"+"的优先级比"<<" 和 ">>"要高 ,结果一直出不来
     7 #define PARENT(i)    (i-1)>>1        //(i-1)/2   // (i-1)>>1
     8 #define RIGHT(i)     (i<<1)+2        //(i*2)+2   // i<<1+2
     9 #define LEFT(i)      (i<<1)+1        //(i*2)+1   // i<<1+1
    10 
    11 //使结点i 维持最大堆的性质,length 
    12 void maxHeapInfy(int arr[],int i,int heapsize)
    13 {
    14     int left = LEFT(i);
    15     int right = RIGHT(i);
    16     int largest = i;
    17     if (left<=heapsize && arr[left]>arr[largest])
    18         largest = left;
    19     
    20     if (right<=heapsize && arr[right]>arr[largest])
    21         largest = right;
    22 
    23     if (i!=largest)
    24     {
    25         swap(arr[i],arr[largest]);
    26         maxHeapInfy(arr,largest,heapsize);
    27     }    
    28 }
    29 
    30 void buildMaxHeap(int arr[],int heapsize)
    31 {
    32     //数组元素下标为[0...n],
    33     //则从n/2到n都为叶结点,单个元素符合MaxHeap性质
    34     int i=0;
    35     for (i=heapsize>>1;i>=0;i--)
    36         maxHeapInfy(arr,i,heapsize);    
    37 }
    38 
    39 void maxHeapSort(int arr[],int length)
    40 {
    41     /*构建MaxHeap以后arr[0]的元素始终都是最大值
    42     将arr[0] 和 arr[n] 交换,接着将heapsize减一
    43     然后arr[0...n-1]维持最大堆
    44     */
    45     buildMaxHeap(arr,--length);
    46     for (int i=length;i>0;i--)
    47     {
    48         swap(arr[0],arr[i]);
    49         length--;
    50         maxHeapInfy(arr,0,length);
    51     }
    52 }
    53 
    54 int main()
    55 {
    56     int arr[] = {2,6,1,0,4};
    57     int length = sizeof(arr)/sizeof(int);
    58     maxHeapSort(arr,length);
    59     for (int i=0;i<length;i++)
    60     {
    61         cout<<arr[i]<<endl;
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    自定义swiper索引值的样式
    返回上一页面后页面后自动刷新(跨域也可)
    点击跳转到页面指定位置
    移动端输入框弹起影响布局(包括fixed布局情况)
    thinkPHP5模版页面volist循环offset使用
    Vue i18n国际化在实际项目中的使用
    前端Cookie、essionStorage、LocalStorage 的区别
    前端常用的一些浏览器对象
    前端取?后面的值
    前端下载文件重命名解决
  • 原文地址:https://www.cnblogs.com/lanrenxinxin/p/4360969.html
Copyright © 2011-2022 走看看