所谓的排序就是给定一个序列,然后整理该序列,使其元素呈现递增(或者递减)的状态排列。
经典的排序算法包括:直接插入排序、二分插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序等。
今天来学习最简单的排序算法——直接插入排序
我们可以将给定的一个序列分为两部分,一部分是有序区间,另一部分是无序区间。例如,给定的序列有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)