排序算法-归并排序

对排序算法的分类一般按照以下几点:

1. 按排序是否稳定,即元素之间的相对顺序在排序后是否改变来分,可以分为稳定排序和不稳定排序。

其中稳定排序有冒泡排序、插入排序、归并排序、基数排序;其余是不稳定排序。

2.按在排序过程中是否要借助其余的存储空间,即是否是直接在原序列上操作的,可以分为内部排序和外部排序。

其中内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择排序、交换排序、归并排序和分配排序。

插入排序主要包括直接插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括气(冒)泡排序和快速排序。

其余的为外部排序。

3.按在排序过程中的主要操作方式,可以分类如下:

插入排序

直接插入排序(基于链表)

 

折半插入排序

 

希尔排序

快速排序

快速排序

 

改进的快速排序

选择排序

直接选择排序

 

锦标赛排序

 

堆排序

 

归并排序(基于链表)

分配排序

桶排序

 

基数排序

 

MSD基数排序

 

LSD基数排序

 

内部排序算法分析


之前学习了插入排序快速排序,今天又认真复习了一下归并排序。总结如下:

归并排序的基本概念可以参考维基百科

以下C++代码均可以直接运行~

/* 
* Author lxywl09 
* Date   2014/10/13  
* 归并排序 
*/  

#include <iostream>
#include <queue.h>
using namespace std;

//归并
void Merge(int numbers[], int start, int middle, int end)
{
  if(numbers==NULL || start<0 || middle<0 || end<0) return;
  
  //利用队列暂存数组中的数据 
  queue<int> queueTemp;
  int index1 = start;
  int index2 = middle+1;
  while(index1<=middle && index2<=end)//对两组的数据从左向右查找 
  {
    if(numbers[index1]<=numbers[index2]) queueTemp.push(numbers[index1++]);
    else queueTemp.push(numbers[index2++]); 
  }
  while(index1<=middle) queueTemp.push(numbers[index1++]);//如果前面一组数据尚有剩余 
  while(index2<=end)    queueTemp.push(numbers[index2++]);//如果后面一组数据尚有剩余
  
  //将临时队列中的数据复制到数组
  int index = start;
  while(!queueTemp.empty()) 
  {
    numbers[index++] = queueTemp.front();
    queueTemp.pop();
  }
}
//归并排序 
void MergeSort(int numbers[], int start, int end)
{
  if(start<end)//如果start<end,一直“分” 
  {
    int middle = (start+end)/2;
    MergeSort(numbers, start, middle);
    MergeSort(numbers, middle+1, end);
    Merge(numbers, start, middle, end);//合并 
  }
} 

int main()
{
  int numbers[100];
  int size;
  cin>>size;
  int i=0;
  while(i<size) cin>>numbers[i++];

  MergeSort(numbers,0,size-1);
  cout<<"After MergeSort:"<<endl;
  for(i=0;i<size;i++)
    cout<<numbers[i]<<" ";
  cout<<endl;
  
  system("pause");
  return 0; 
}
/*=========输入与输出========= 
7
0 16 20 3 11 17 8
After MergeSort:
0 3 8 11 16 17 20
==============================*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值