1.排序的概念及其运用
1.1排序的概念
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。
2.常见排序-插入排序
2.1.1基本思想:
直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
实际中我们玩扑克牌时,就用了插入排序的思想
2.1.2直接插入排序:
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移
3.插入排序实现
3.1实现思路:
3.1.1实现单次插入排序
1.从第一个元素开始,该元素可以认为已经被排序
2.取下一个元素tmp,从已排序的元素序列从后往前扫描
3.如果该元素大于tmp,则将该元素移到下一位
4.重复步骤3,直到找到已排序元素中小于等于tmp的元素
5.tem插入到该元素的后面,如果已排序所有元素都大于tmp,则将tmp插入到下标为0的位置
6.重复步骤2~5
思考:while循环的条件
当最后一次进入循环时,end最后值为-1;
while (end >= 0)
//插入排序
void InsertSort(int* a, int n) {
int end = 1;
int tmp = a[end + 1];
//取出end+1的值
while (end >= 0) {
if (tmp < a[end]) {
a[end + 1] = a[end];
end--;
}
else {
break;
}
}
//当end=-1,该值最小,取0位
//当tmp>a[end],此时end+1取tmp值
a[end+1] = tmp;
}
3.1.2插入排序
//插入排序
void InsertSort(int* a, int n) {
for (int i = 0; i < n; i++) {
int end = i;
int tmp = a[end + 1];
//取出end+1的值
while (end >= 0) {
if (tmp < a[end]) {
a[end + 1] = a[end];
end--;
}
else {
break;
}
}
//当end=-1,该值最小,取0位
//当tmp>a[end],此时end+1取tmp值
a[end+1] = tmp;
}
}