Eva 初学算法笔记 ——— 1.直接插入排序
引言:
上一年专业开设了《数据结构与算法》这门课程,但当时没有认真学。过了之后发现自己对于那些基本的经典算法都忘得差不多了,大学剩下的日子也不想当咸鱼。所以最近开始重新学习算法,写博客是为了做笔记加深记忆和理解,并不是像其他大神那样做教程。所以哪里错了希望大家可以指出,给点建议我这个初学者。
直接插入排序算法应该是我们这些听到最多的一种排序算法之一(尽管这样,我当时学完还是忘了)。它的基本思想是把一组数据分为有序区域和无序区域两部分,无序区域中的数据通过与有序区域的数据对比找到合适的位置进而插入到有序区域。
例如有一组待排序的无序序列,其中有n个元素(升序排序):
{ 4 , 2 , 3 , 7 , 1 , 5 , 0 , 9 , 8 , 6 }
- 因为一开始有序区域并没有任何元素,这里我们把array[0],即第1个元素放到有序区域。设无序区域的第1个元素为array[ i ],此时array[ i ]=2
{ 4 , 2 , 3 , 7 , 1 , 5 , 0 , 9 , 8 , 6 }
- 现在有序区域的最后1个元素为‘4’,即array[ i-1 ]=4(同时也是第1个,因为目前只有1个元素),现在把无序区域的第1个元素array[ i ]=2与有序区域的元素array[ i-1 ]=4相比较,很明显4>2,所以把array[ i ]插入到元素‘4’前面
{ 2 , 4 , 3 , 7 , 1 , 5 , 0 , 9 , 8 , 6 }
- 通过上一步,有序区域元素+1,无序区域元素-1。由于变量 i 是代表无序区域的第1个元素,所以此时i=i+1,即array[ i ]=3。重复上述步骤array[ i ]与有序区域最后1项对比,得array[ i-1 ]>array[ i ] 。 则元素‘3’会排在元素’4‘之前,继续和前面元素’2‘对比,就可以确定元素’3‘应该插入到有序区域的’2‘和’4‘之间。
{ 2 , 3 , 4 , 7 , 1 , 5 , 0 , 9 , 8 , 6 }
- 重复上述步骤,无序区域第1个元素’7‘与有序区域最后1个元素‘4’对比。由于有序区域已经是按照升序排序得出的有序序列(即7比有序区域的所有元素都大),所以元素‘7’的位置保持不变。
{ 2 , 3 , 4 , 7 , 1 , 5 , 0 , 9 , 8 , 6 }
- 多次重复上述步骤,直到最后1个待排序的元素array[n-1]=6插入到合适的位置,到此排序完成
{ 0 , 1 , 2 , 3 , 4 , 5 , 7 , 8 , 9 , 6 }
===>> { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }
以下是代码演示:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#define SIZE 10
void print(int a[], int n)
{
for (int i = 0; i<n; i++)
{
printf("%d ", a[i]);
Sleep(100);
}
printf("\n\n ");
}
void Insert_Sort(int a[], int n)
{
for (int i = 1; i < 10; i++)
{
int j = i - 1;
while (j >= 0)
{
if (a[i]>a[j])
{
break;
}
j--;
}
if (j != i - 1)
{
int tmp = a[i];
int k = i - 1;
while (k > j)
{
a[k + 1] = a[k];
k--;
}
a[k + 1] = tmp;
}
print(a, n);
Sleep(200);
}
}
int main()
{
int a[10] = { 4, 2, 3, 7, 1, 5, 0, 9, 8, 6 };
printf("Original sequence: ");
print(a, SIZE);
Insert_Sort(a, SIZE);
system("pause");
return 0;
}
运行效果如下: