快速排序和归并排序对比

快速排序和归并排序对比

快速排序

排序流程

(1)首先设定一个分界值(一般为第一个元素),通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成。

性能分析

O(Nlog2N),不稳定

参考代码

int Partasion(int number[],int left,int right)
{
    int piviot=number[left];
    while(left<right)
    {
        while(number[right]>piviot&&left<right)
            right--;
            if(left<right)
                number[left++]=number[right];
        while(number[left]<piviot&&left<right)
            left++;
         if(left<right)
                number[right--]=number[left];
    }
    number[left]=piviot;
    return left;
}
void QuickSort(int number[],int left,int right)
{
    if(left<right)
    {
        int piviot=Partasion(number,left,right);
        QuickSort(number,left,piviot-1);
        QuickSort(number,piviot+1,right);
    }
}

归并排序

排序流程

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

性能分析

O(NlogN),稳定

参考代码

void MergeNumber(int number[],int left,int right)
{
  int temp[10];
  int i,j,k=left;
  int midle=(left+right)>>1;
  for(i=0;i<=right;i++)
        temp[i]=number[i];
  i=left;
  j=midle+1;
  while(i<=midle&&j<=right)
  {
      if(temp[i]<temp[j])
        number[k++]=temp[i++];
      else
        number[k++]=temp[j++];
  }
  while(i<=midle)
    number[k++]=temp[i++];
}
void MergeSort(int number[],int left,int right)
{
    if(left<right)
    {
        int midle=(left+right)>>1;
        MergeSort(number,left,midle);
        MergeSort(number,midle+1,right);
        MergeNumber(number,left,right);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值