排序是在编程过程中会经常遇到,并且十分重要,在了解排序算法前,先了解下排序的基本概念
排序项:作为排序依据的数据称为排序项,也称为记录的关键码(Keyword)
* 关键码(关键码分为两种)
* 主关键码 (Primary Keyword) 如果关键码是主关键码 排序结果是唯一的
* 次关键码(Secondary Keyword) 如果关键码是次关键码 则排序结果不唯一
判断排序方法是不是稳定排序方法
如果使用某个排序方法对任意的记录序列按关键码进行排序,相同的关键码值的记录之间的位置关系与排列前一致,则排序方法是稳定的;如果不一致,则排序方法是不稳定的。
例如下面的一队数据
主关键码就是 姓名的ASCALL码值,次关键码就是 分数
如果一个排序方法以次关键码(分数)进行从大到小排序,如果每一次排序结果的 a,b前后位置都没有发生改变,那么这个方式就是稳定方法,但是如果有一次a,b位置发生改变,那么这个方法就是不稳定方法,
四种排序算法
一、直接插入排序(稳定排序方法)
这里我画了一个图有点抽象,看文字,辅助理解
排序思路:从第二个元素开始遍历,让当前的元素(a)和前面的所有的元素(b)进行比较,如果前面的元素(b)大于当前元素(a)就把(b)向后移动一位下标,如果前面的元素(b)小于当前元素(a),那么就把当前元素(a)存储(b)下标+1的位置。遍历完后如果所有的(b)都大于当前元素(a)那么就把(a)存入第一个元素的位置。
代码
/// <summary>
/// 直接插入算法 稳定排序
/// </summary>
/// <param name="array"></param>
static void InsetSort(int[] array)
{
//首先从第二个元素开始遍历
for (int i = 1; i < array.Length; i++)
{
int value = array[i];
bool isMin = true;
//让 i 下标前的全部数据和 i下标数据进行比较
for (int j = i-1; j>=0 ; j--)
{
if(array[j]>value)//只要比i下标数据大就向后移一位下标,
{
array[j + 1] = array[j];
}
else//如果比i下标数据小或者相等,那么就把i下标数据赋值到他后面
{
array[j+1] = value;
isMin = false;
break;//这里需要跳出循环,因为前面的值都是比i下标数据小