排序算法——直接插入排序

  所谓的排序就是给定一个序列,然后整理该序列,使其元素呈现递增(或者递减)的状态排列。

  经典的排序算法包括:直接插入排序、二分插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序等。

  今天来学习最简单的排序算法——直接插入排序

  我们可以将给定的一个序列分为两部分,一部分是有序区间,另一部分是无序区间。例如,给定的序列有n个元素,我们用区间[0,1,2,...,n-1]来

表示这个序列,其中0至n-1是元素的下标。那么,在未排序前,我们可以将其分为两部分,[0]和[1,2,...,n-1],区间[0]只有第一个元素,显然它是有序的,

区间[1,2,...,n-1]是无序的,是需要我们进行排序的元素。直接插入排序的思想就是从无序区间中选取一个元素,插入到有序区间中,在排序的过程中,需要不断

地将待插入的元素与有序区间的元素进行比较,找到插入位置,然后移动元素,腾出位置,让带插入的元素插入进去。经过一趟排序后,有序区间的

元素增加,无序区间的元素减少,这样经过n-1趟排序后,整个区间都是有序的。

  代码实现如下:

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 
 4 void InsertSort(int A[], int n)
 5 {   
 6     int i, j, temp;
 7     for(i = 1; i < n; i++)                      // 待排序前,无序区间为[1,n-1]
 8     {
 9         temp = A[i];                            // 局部变量保存待插入的元素
10         for(j = i - 1; j >= 0; j--)             // 有序区间从后向前取元素
11         {
12             if(A[j] > temp)
13                 A[j+1] = A[j];                  // 向后移动元素
14             else
15                 break;                          // 找到插入位置,跳出内循环
16         }
17         A[j+1] = temp;                          // 插入元素
18     }
19 }

  直接插入排序的时间复杂度:O(n2),空间复杂度为:O(1)

  

原文地址:https://www.cnblogs.com/greedyco/p/7134572.html