插入排序InsertionSort,参数是一个数组包含了n个待排序的数,输入的各个数字是原地排序的(sorted in place),意即这些数字就是在数组A中进行重新排序的,在任何时刻,至多只有其中的常数个数字是存储在数组之外的,当过程InsertionSort执行完毕后,输入数组A中就包含了已排好序的数组输出序列。
下面是利用C++语言实现的插入排序代码:
#include <iostream> #define N 10 using namespace std; //声明插入排序函数 int* insertionSort(int *array,int length); int main() { int array[N] = {2,1,3,67,35,12,9,7,45,0}; insertionSort(array,N); for(int i=0;i<N;i++) { cout<<array[i]<<endl; } return 0; } int * insertionSort(int * array,int length) { for(int i=1;i<length;i++) { int key = array[i]; int j = i-1; while(j>=0 && array[j]>key)//注意j的取值>=0 { array[j+1] = array[j]; j=j-1; }//while array[j+1] = key; }//for return array; }
插入排序的算法复杂性分析:对于插入排序,它的复杂性依赖于待排序数组的一些属性,待排序数组长度、已排好序程度等。我们一般考察最坏情况下即逆序排序和最佳情况下即已排好序的复杂性。
最佳情况下:此时待排序数组已经是一个排好序的数组,推理可得程序运行时间可以表示为an+b;因此,它是n的一个线性函数。
最坏情况下:此时待排序数组是一个逆序数组,此时,我们必须把每个元素array[i]与整个已排序的子数组array[1...i-1]中的每个元素进行比较,因而,最坏情况下程序的运行 时间为an^2+bn+c,这是一个关于n的二次函数。
一般来说,如同插入排序一样,一个算法的运行时间对某一给定的输入来说,往往是固定的。