快速排序的改进方法

原创 2016年06月02日 12:37:20

可以在选择中枢结点时,选择left, right,(left+right)/2三个位置中关键字居中的元素。

注意需要将选好的中枢结点与左端元素交换位置,因为如果不交换位置,算法就有问题了,这是由于right--在left++先执行,导致right最后退出循环时指向的值一定比中枢结点值小。例如选择的是right作为中枢结点,最后一步会把更小的值交换到最后。

void quickSort(Element arr[], int left, int right)
{
    int mid;
    
    if(left < right)
    {
        mid = partition_im(arr, left, right);
        quickSort(arr, left, mid-1);
        quickSort(arr, mid+1, right);
    }
}


int partition_im(Element arr[], int left, int right)
{
    Element base;
    Element temp;
    int min, mid;
    
    mid = (left + right)/2;
    min = median(arr, left, mid, right);//选择三者中的中间值
    base = arr[min];
    
    //将中轴元素与左端点元素交换位置
    if(min != left)
    {
        temp = arr[min];
        arr[min] = arr[left];
        arr[left] = arr[min];
        min = left;
    }
    
    while(left < right)
    {
        while(arr[right].key >= base.key && right > left)
            right--;
        while(arr[left].key <= base.key && left < right)
            left++;
        if(left < right)
        {
            temp = arr[right];
            arr[right] = arr[left];
            arr[left] = temp;
        }
    }

    arr[min] = arr[left];
    arr[left] = base;
        
    return left;
}


快速排序的改进

快速排序的改进 快速排序最坏情况下,要比较O(n^2)次,但平均性能为nlogn,基本达到了比较类排序所需时间的的下界。核心代码为: void qSort(int *data, int begin...
  • u013861473
  • u013861473
  • 2014年05月28日 22:24
  • 1350

快速排序 改进快排的方法

快速排序法事应用最广泛的排序算法之一,最佳情况下时间复杂度是 O(nlogn)。但是最坏情况下可能达到O(n^2)。说明快速排序达到最坏情况的原因。并提出改善方案并实现之。 答: 改进方案:改进选...
  • lingfengtengfei
  • lingfengtengfei
  • 2013年10月07日 11:32
  • 13839

快速排序及优化(Java版)

快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。 一次快速排序详细过程: 选择数组第一个值作为枢轴值。 代码实现:package Q...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015年06月12日 20:56
  • 2861

冒泡排序的改进算法和快速排序

通过实现快速排序让我对排序算法有了更加深入的理解,希望再接再厉。
  • qq_34328833
  • qq_34328833
  • 2016年04月20日 20:40
  • 2012

快速排序的稳定化实现

稳定排序的概念: 保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。 例如:a[i]==a[j]&&i通常的快速排序为什么不稳定?快速排序初始的版本:int part...
  • liuchenjane
  • liuchenjane
  • 2017年06月07日 17:38
  • 859

快速排序--C语言

 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个...
  • yifan268
  • yifan268
  • 2007年03月14日 23:42
  • 12008

【快速排序】

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的...
  • leolin_
  • leolin_
  • 2011年08月19日 11:17
  • 854

快速排序的基本算法和改进实现

  • 2015年03月18日 17:54
  • 49KB
  • 下载

快速排序改进

看了几页书,大概总结一下。快速排序是平均状况下性能最为良好的排序算法,时间复杂度(平均情况)为o(nlogn)。但是最坏情况下也会达到o(n^2),也就是说,当待排序的序列是完全有序的时候,快速排序递...
  • empyrealwd
  • empyrealwd
  • 2010年12月01日 15:28
  • 2561

快速排序的几种常见实现及其性能对比

Hoare的变形版本(空穴法) 快速排序算法是一种不稳定的排序算法。其时间复杂度为O(nlogn),最坏复杂度为O(n^2);快排的空间复杂度为O(logn),这个不确定正确。 假设待排序的数组为a[...
  • u013074465
  • u013074465
  • 2014年12月22日 19:11
  • 5187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速排序的改进方法
举报原因:
原因补充:

(最多只允许输入30个字)