赞
踩
这篇文章我们来学习排序。
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
其实在我们生活中,很多地方都要用到排序。
比如:
接下来,我们就来讲解并实现一下常见的排序算法。
首先我们来学习直接插入排序:
直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
实际中我们玩扑克牌时,就用了插入排序的思想
排序我们一般是对一个数组进行操作:
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移
一趟直接插入排序:
所以一趟直接插入排序就是这样的:
end指向原有序数据的最后一个,那要插入的数据和end指向的数据进行对比,如果比end指向的数据大,那直接放在end后面,如果小,则把end指向的大的数据向后移动,end- - ,与前面的元素进行比较,直到遇到比要插入的元素小的数据,然后把要插入的数据放在其后面。
那如果前面的元素都比要插入的数据大呢?
那就一直比,直到比完第一个元素,然后end- -之后变成-1,还是放到end位置的后面,即让它成为新的第一个元素。
那我们先来写一下一趟直接插入排序的代码:
这是一趟的,那现在有一个数组,我们如何使用直接插入排序对其进行排序呢?
我们是不是可以先把数组的第一个元素看成是有序的,让end指向第一个元素,然后把第二个元素当作即将要插入的数据,这样一趟之后,前两个就有序了,然后我们再插入第三个,依次循环往复,当数组最后一个元素进行完插入,整个数组就有序了。
那其实在我们刚才写的一趟直接插入排序的基础上,外层加个循环控制end就行了。
//直接插入排序 void SInsertSort(int* arr, int len) { for (int i = 0; i < len - 1; i++) { int end = i; int tmp = arr[end + 1]; while (end >= 0) { if (tmp < arr[end]) { arr[end + 1] = arr[end]; end--; } else { break; } } arr[end + 1] = tmp; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。