一.选择排序
1.1 原理介绍
选择排序是一种容易理解的排序。其思想是:从一组未排序的数据元素中选出最小(或最大)的一个元素,放到该组数据元素的最前面,之后每一趟都从剩余未排序的元素中继续寻找最小(或最大)元素,放到已排序好元素的后面。以此类推,直到所有的元素排序完毕。选择排序是一种不稳定的排序方式。
1.2 动画演示
1.3 代码实现
void SelectSort(int a[],int n){
for(int i=0;i<n-1;i++){ //n个元素的简单排序需要n-1趟处理。
int min=i;
for(int j=i+1;j<n;j++)
if(a[j]<a[min])
min=j;
if(min!=i){
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
}
1.4 算法分析
选择排序的时间复杂度是 。无论是有序,逆序,还是乱序,一定要经过n-1趟比较处理,而在交换操作中,最好的情况是正序,无需交换元素,最坏的情况是逆序,需要交换n-1次。综上所述,时间复杂度为。
空间复杂度为。
二. 插入排序
2.1 原理介绍
插入排序,一般也被称为直接插入排序。插入排序是一种最简单的排序方法,它的基本思想是每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成(即将一个数插入一个已经排好序的数据中)。对于少量元素的排序,它是一个有效的算法 ,而且是一种稳定的排序方式。
2.2 动画演示
2.3 代码实现
void InsertSort(int a[],int n){
int i,j,temp;
for(i=1;i<n;i++)
if(a[i]<a[i-1]){
temp=a[i];
for(j=i-1;j>=0&&temp<a[j];j--)
a[j+1]=a[j]; //所有大于temp的元素后移
a[j+1]=temp;
}
}
2.4 算法分析
时间复杂度
在插入排序中,最好的情况是待排序数组是有序时,共n-1趟处理,每一趟只需要对比关键字1次,不要移动元素,时间复杂度为。
最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+n-1,所以,插入排序最坏情况下的时间复杂度为。
综上,平均时间复杂度为。
空间复杂度
插入排序的空间复杂度为。