1. 按照排序过程中依据的不同原则对内部排序方法进行分类,可以分为,插入排序,交换排序,选择排序,归并排序,计数排序等。
2. 按照内部排序过程所需的工作量来区分,则可分为三类:简单的排序算法,时间复杂度为O(n2);先进的排序算法,时间复杂度为O(n log n );基数排序,时间复杂度为O(d*n);
3. 直接插入排序:Straight Insert Sort 将一个记录插入到已经排好序的有序表中,从而得到了一个新的,记录数增1的有序表。
#include "stdafx.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
int source[5]={5,4,3,2,1};
for(int i=1;i<5;i++)
{
int temp=source[i];
if(temp<source[0])
{
for(int m=i;m>0;m--)//注意要从后往前挪
source[m]=source[m-1];
source[0]=temp;
continue;//这个很重要
}
for(int j=i-1;j>=0;j--)
{
if(temp<=source[j]&&temp>=source[j-1])
{
for(int k=i;k>j;k--)
source[k]=source[k-1];
source[j]=temp;
}
}
for(int k=0;k<5;k++)
printf("%d ",source[k]);
return 0;
}
4. 希尔排序,也是一种属于插入排序类的方法,先将整个待排序列分割成若干个子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。希尔排序有一个确定增量的问题。
5. 快速排序,基于交换的算法,快速排序是对起泡排序的一种改进,把第一个元素当作指标,然后分成两类,一类比该元素大,一类比该元素小。以此类推。多用递归来实现。
6. 简单选择排序(Simple Selection Sort) ,每一趟在n-i+1(i=1,2,……,n-1)个记录中选取关键字最小的纪录作为有序序列中第i个记录。
#include "stdafx.h"
#include "stdio.h"
//简单选择排序
int main(int argc, char* argv[])
{
int source[5]={14,2,20,1,58};
for(int i=0;i<4;i++)
{
int min=source[i];
int flag=i;
for(int j=i;j<5;j++)
{
if(source[j]<min)
{
min=source[j];
flag=j;
}
}
source[flag]=source[i];
source[i]=min;
for(int k=0;k<5;k++)
printf("%d ",source[k]);
printf("/n");
}
return 0;
}
7. 归并排序(Merging Sort),O(m+n)时间量级上实现。就是先将两个两个进行比较定好,然后再组合。例如:(1,2,5,3,7,4)->一趟后((1,2),(3,5),(4,7));
8. 基数排序(Radix Sorting) (略)
9. 小结
排序分类 | 排序名称 | 时间复杂度 | 是否稳定 |
插入排序 | 直接插入排序 | O(n2 ) | 是 |
希尔排序 | O(n2 ) | 否 | |
交换排序 | 快速排序 | O(nlogn) | 否 |
选择排序 | 简单选择排序 | O(n2 ) | 是 |
归并排序 | 归并排序 | O(nlogn) | 是 |
基数排序 | 基数排序 | O(d(n+rd)) | 是 |