知识要点:
1、插入排序法(含折半插入排序法)、选择排序法、泡排序法(冒泡排序)、快速排序法、
堆积排序法(堆排序)、归并排序、基数排序等排序方法排序的原理、规律和特点;
2、各种排序算法的时空复杂度的简单分析。
排序的稳定性:排序后不改变原序列中相同元素的相对顺序,则此排序方法是稳定的,反之是不稳定的;
一般情况下,排序的稳定性与其效率成反比;
插入排序法(含折半插入排序法):
算法思想:每次将一个待排序的数据,跟前面已经有序的序列的数字一一比较找到自己合适的位置,插入到序列中,直到全部数
据插入完成。(找位置+挪位置)
void InsertSort(int data[],int n){
int j;
for(int i=1;i<n;i++){
int t=data[i];//待插入数据
for(j=i;j>0;j--){
if(data[j-1]>t){
data[j]=data[j-1];
//元素后移;
}
else{
break;
//找到插入位置
}
}
data[j]=t;
}
}
折半插入排序和插入排序的时间复杂度相同,两者的区别在于比较的次数不同 ,对于插入排序最坏比较次数为n(n-1)/2,即平均
比较次数为n^2数量级;而对于折半插入排序,采用折半查找的方式查找元素的插入位置,平均比较次数为nlogn数量级;两者的
就在于确定元素插入位置的比较次数;
时间复杂度:O(n^2); 稳定性:稳定;
选择排序法:
算法思想: 数组分成有序区和无序区,初始时整个数组都是无序区,然后每次从无序区选一个最小的元素直接放到有序区的最
后,直到整个数组变有序区。每一次选择待排序列中的最小(最大)的值放入有序序列为尾部;
void SelectSort(int data[],int n){
for(int i=0;i<n;i++){
int t=i;
for(int j=i+1;j<n;j++){
if(data[j]<data[t]){
t=j;
}
}
if(t!=i){
int temp=data[t];
data[t]=data[i];
data[i]=temp;
}
}
}
时间复杂度:O(n^2); 稳定性:不稳定/稳定;(基于交换的是不稳定的,基于插入的是稳定的)</