C语言:直接插入排序图解

C语言:直接插入排序图解

  • 一、背景
  • 二、做法
  • 三、图解
  • 四、源程序
  • 五、总结


一、背景

  给定如下数组,使用直接插入排序的方法对其进行升序排列。

            int data[6]={5,3,1,6,3,4};

二、做法

  在插入第i个记录时,R1, R2, …, Ri-1已经排好序,这时将Ri的关键字ki依次与关键字ki-1, ki-1等进行比较,从而找到应该插入的位置并将Ri插入,插入位置及其后的记录依次向后移动。

三、图解

符号解释:
  i:数组序号,初值为1,data[i]指向将要排序的数。
  j:数组序号,初值为i-1,用于确定data[i]插入位置。
  temp:保存中间值data[i]。
  data:数组,存放将要排序的数字。
C语言:直接插入排序图解_第1张图片
1、首先默认data[0]已排好序,从data[1]开始进行插入排序。从下图可发现,从data[i]的插入位置为0(紫色部分),故保存data[i]至temp,将data[0]右移1位,temp插入data[0]。如此data[i]便排好序,此轮循环结束,i++,j=i-1进入下一循环。

C语言:直接插入排序图解_第2张图片
C语言:直接插入排序图解_第3张图片
C语言:直接插入排序图解_第4张图片
C语言:直接插入排序图解_第5张图片

2、如下图,i=2, j=1。data[i]的插入位置为0(紫色部分),故保存data[i]至temp,将data[1]和data[0]右移1位,temp插入data[0]。
C语言:直接插入排序图解_第6张图片
C语言:直接插入排序图解_第7张图片
C语言:直接插入排序图解_第8张图片
C语言:直接插入排序图解_第9张图片
C语言:直接插入排序图解_第10张图片
3、如下图,i=3, j=2,data[i]>data[j]。故无需排序,直接进入下一循环。
C语言:直接插入排序图解_第11张图片
4、如下图,i=4, j=3,data[i]插入位置为2,保存data[i]至temp,将data[3]和data[2]右移1位,在data[2]插入temp。
C语言:直接插入排序图解_第12张图片
C语言:直接插入排序图解_第13张图片
C语言:直接插入排序图解_第14张图片
C语言:直接插入排序图解_第15张图片
C语言:直接插入排序图解_第16张图片
5、如下图,i=5, j=4,data[i]插入位置为3,保存data[i]至temp,将data[4]和data[3]右移1位,在data[3]插入temp。
C语言:直接插入排序图解_第17张图片
C语言:直接插入排序图解_第18张图片
C语言:直接插入排序图解_第19张图片
C语言:直接插入排序图解_第20张图片
C语言:直接插入排序图解_第21张图片
6、当i等于数组个数时,循环结束,排序完成。

四、源程序

#include
#define N 6

//输出中间过程的结果 
void print_data(int i, int n, int data[]){
	int k;
 	printf("i=%d: ", i);
 	for(k=0;k=0 && temp

五、总结

1、直接插入排序是稳定的排序方法,时间复杂度为O(n2),空间复杂度为O(1)
2、理解算法思路比记代码更有效,因为不同人,不同书,对于同一算法,源代码肯定不一样。

你可能感兴趣的:(C语言,直接插入排序,c语言)