直接插入排序,就像上体育课时,比个头排纵队,矮的同学向前走,一直走到比他矮的。只不过咱们数据结构的直接插入排序,需要比对的值是从数组第二个位置开始的,一直循环到整个数组。现实中排队,是很多同学一起,排队,再检索。
这里有张插入排序的图,可以好好捋捋思维。注意数组索引,下面的代码,循环的边界问题才能清除。多想几遍,注意数组索引是从0开始的。数组的长度是数组最后一个数据索引+1。
下面是代码部分:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _006_直接插入排序
{
class Program
{
static void InsertSort(int[] dataArray)
{
for (int i = 1; i < dataArray.Length; i++) //从数组拿第二个值dataArray[1]和dataArray[0]比较大小,循环至整个数组排好序
{
bool isInsert = false; //标志,判断是否插过了
int iValue = dataArray[i]; //保存当前需要比对的值dataArray[i] 为 iValue,防止移动数据时被覆盖
for (int j = i - 1; j >= 0; j--) // 将dataArray[i]和它前面的的所有值作比较
{
if(dataArray[j] > iValue) //如果 当前遍历位置的值 dataArray[j] > iValue
{
dataArray[j + 1] = dataArray[j]; //就把 当前遍历位置的值 dataArray[j] 向后移动一位
}
else //如果 当前遍历位置的值 dataArray[j] < iValue
{
dataArray[j + 1] = iValue; //就把 iValue 放到 dataArray[j] 后面 即 dataArray[j + 1]位置
isInsert = true;
break; //一定要记得加break,否则,会插很多次,值会覆盖混乱
}
}
if (!isInsert) //经过循环,标志false显示未被插入,证明iValue是比它前面的值都小,故将其放入数组0号位置
{
dataArray[0] = iValue;
}
}
}
static void Main(string[] args)
{
int[] dataArray = new int[] { 1, 5, 3, 2, 7, 9, 4, 6, 8};
InsertSort(dataArray);
foreach(var temp in dataArray)
{
Console.WriteLine(temp);
}
Console.ReadKey();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _006_直接插入排序
{
class Program
{
static void InsertSort(int[] dataArray)
{
for (int i = 1; i < dataArray.Length; i++) //从数组拿第二个值dataArray[1]和dataArray[0]比较大小,循环至整个数组排好序
{
bool isInsert = false; //标志,判断是否插过了
int iValue = dataArray[i]; //保存当前需要比对的值dataArray[i] 为 iValue,防止移动数据时被覆盖
for (int j = i - 1; j >= 0; j--) // 将dataArray[i]和它前面的的所有值作比较
{
if(dataArray[j] > iValue) //如果 当前遍历位置的值 dataArray[j] > iValue
{
dataArray[j + 1] = dataArray[j]; //就把 当前遍历位置的值 dataArray[j] 向后移动一位
}
else //如果 当前遍历位置的值 dataArray[j] < iValue
{
dataArray[j + 1] = iValue; //就把 iValue 放到 dataArray[j] 后面 即 dataArray[j + 1]位置
isInsert = true;
break; //一定要记得加break,否则,会插很多次,值会覆盖混乱
}
}
if (!isInsert) //经过循环,标志false显示未被插入,证明iValue是比它前面的值都小,故将其放入数组0号位置
{
dataArray[0] = iValue;
}
}
}
static void Main(string[] args)
{
int[] dataArray = new int[] { 1, 5, 3, 2, 7, 9, 4, 6, 8};
InsertSort(dataArray);
foreach(var temp in dataArray)
{
Console.WriteLine(temp);
}
Console.ReadKey();
}
}
}
运行结果截图: