zoukankan      html  css  js  c++  java
  • 【Sort】QuickSort

      快速排序,平均运行时间O(N log N),最坏运行时间O(N^2)。

      我觉得先看Python版的快排算法(http://www.cnblogs.com/fcyworld/p/6160558.html)比较容易理解。

    整体思路:

      首先从数组中选出一个值pivot,然后依据这个值pivot,把数组分成大小两部分,然后再分别对这两部

    分利用快排。

    具体细节:

      1.在具体的实现中,因为pivot的选择会对数组的划分产生很大的影响,若划分的不均衡,严重影响排序效率

    为了尽可能消除这种影响,同时取数组中的索引为0,n-1,和中值中的中间值作为pivot。产生pivot的时候,0,n-1

    位置上的值已经满足pivot的要求,所以排序时候不需要再考虑,所以把pivot的值保存再n-2位置上。

      2.为了把数组划分为两部分,利用双指针i,j。i从前往后掠过小于pivot的值,j从后往前掠过大于pivot的

    值,当i,j停止的时候,如果i<j,交换i,j所指位置上的值,否则break;

      3.在小的数组中(数组的大小<cutoff),快排的效率并不高,所以小数组时候利用插入排序

     1 void quicksort(int *nums,int n)
     2 {
     3     qs(nums,0,n-1);
     4 }
     5 void qs(int*nums,int left,int right)
     6 {
     7     int pv;
     8     int i,j;
     9     int cutoff=10;
    10     if(left+cutoff<=right)
    11     {
    12         pv=mid3(nums,left,right);
    13         i=left;
    14         j=right-1;
    15         while(1)
    16         {
    17             while(nums[++i]<pv);
    18             while(nums[--j]>pv);
    19             if(i<j)
    20                 swap(nums[i],nums[j]);
    21             else
    22                 break;
    23         }
    24         swap(nums[i],nums[right-1]);
    25         qs(nums,left,i);
    26         qs(nums,i+1,right);
    27     }
    28     else
    29         intersort(nums+left,right-left+1);
    30 }
    31 int mid3(int *nums,int left,int right)
    32 {
    33     int center=(left+right)/2;
    34     if(nums[left]>nums[center])
    35         swap(nums[left],nums[center]);
    36     if(nums[left]>nums[right])
    37         swap(nums[left],nums[right]);
    38     if(nums[center]>nums[right])
    39         swap(nums[center],nums[right]);
    40     swap(nums[center],nums[right-1]);
    41     return nums[right-1];
    42 }
    43 void swap(int &m,int &n)
    44 {
    45     m^=n;
    46     n^=m;
    47     m^=n;
    48 }
    49 void intersort(int *nums,int n)
    50 {
    51     int i,j;
    52     int tmp;
    53     for(i=1;i<n;i++)
    54     {
    55         tmp=nums[i];
    56         for(j=i;j>0&&tmp<nums[j-1];j--)
    57             nums[j]=nums[j-1];
    58         nums[j]=tmp;
    59     }
    60 }
  • 相关阅读:
    ruby直接底层连接数据库
    debian和ubuntu的sh dash bash
    find locate
    apt-get
    ERROR: The partition with /var/lib/mysql is too full! failed!
    linux访问ftp服务器命令
    win7配置ftp服务器
    黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表
    黑马程序员_Java基础视频-深入浅出精华版--视频列表
    转:Java项目开发规范参考
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6175605.html
Copyright © 2011-2022 走看看