插入排序
**说起排序算法,最先要说的就是插入排序。**因为它简单且稳定。
那么什么是插入排序呢?
例如:
- 有一组数据已经有序(不论升序降序)的排列好了,这时候我们需要在这组数据中再插入一个数据,并且要求该组数据依然有序,那么这个时候我们就可以使用插入排序算法解决问题。
- 算法思想(我们以数组的操作举例(升序)):
1.首先,包含两个以上元素的数组才需要排序。所以我们就从数组的第二个元素开始。
2.将我们选择出来的元素与它左边的元素依次比较,如果左边第一个元素比它大,则比较左边第二个,直到遇到比他小的,就插到这个元素的右边。
3.然后就这样往后选取元素重复上面的步骤。 - 当然,如果你看上面的文字觉得干巴巴的有点晦涩,看不懂是个什么玩意儿。博主还为你准备了下面的代码示例,希望两者对比着看可以对你有所帮助。
代码示例如下(C#实现):
//定义一个整型数组
int[] arr01 = new int[] { 5, 6, 4, 1, 3, 8, 9, 0, 2, 7 };
//第一种方式
//我们定义一个变量temp用来交换值
int temp01;
//从角标1也就是第二个元素开始
for (int i = 1; i < arr01.Length; i++)
{
//将我们选择出来的元素与它左边的元素依次比较
for (int j = i; j > 0; j--)
{
//满足条件就交换两数位置
if (arr01[j] < arr01[j - 1])
{
temp01 = arr01[j];
arr01[j] = arr01[j - 1];
arr01[j - 1] = temp01;
}
}
}
//打印看看是否正确
Console.WriteLine("排序后的数组为:");
for (int i = 0; i < arr01.Length; i++)
{
Console.Write(arr01[i] + " ");
}
好,上面这种方法能够实现我们的插入排序,可是我们可以看到,每次判断为真之后都要进行两数交换,这一操作过于频繁。下面我们就针对这里进行优化,请看第二种实现方法:
代码示例如下(C#实现):
//定义一个整型数组
int[] arr01 = new int[] { 5, 6, 4, 1, 3, 8, 9, 0, 2, 7 };
//第二种方式
//从角标1也就是第二个元素开始
for (int i = 1; i < arr01.Length; i++)
{
//进入第一层循环,我们先定义两个变量temp,index
//temp用来保存我们选择进行插入排序的元素的值
//index用来保存要插入的角标位置
int temp = arr01[i];
int index = i;
//将我们选择出来的元素与它左边的元素依次比较
for (int j = i; j > 0; j--)
{
//满足条件就先变更角标和后移比较过的元素的值
if (temp < arr01[j - 1])
{
arr01[j] = arr01[j - 1];
index = j-1;
}
}
//在合适的位置插入我们选择的值
arr01[index] = temp;
}
//打印看看是否正确
Console.WriteLine("排序后的数组为:");
for (int i = 0; i < arr01.Length; i++)
{
Console.Write(arr01[i] + " ");
}
好啦,上面这个就是优化版本了,可以看到我们省去了很多次交换的步骤,优化了代码。