对排序算法的分类一般按照以下几点:
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
==============================*/