《算法导论》学习笔记——插入排序
插入排序
1.插入排序原理
打算开始学习《算法导论》这本书,就按照章节顺序以插入排序开始吧。
为什么要叫插入排序呢,来看下面这张图(就是《算法导论》上的原图),类似于摸牌并将其从大到小排列。每次摸到一张牌后,根据其点数插入到确切位置。这张图表示的是摸到草花7后进行插入的过程。忽略最右边的草花10,相当于一开始7在最右边,然后逐个与左边的排相比较(当然左边的牌早已排好顺序),将其放置在合适的位置。当摸到草花10后重复上述过程即可。
那么怎样将这个过程应用到排序中?对于一个数组,我们从第二个数字开始,将其认为是新增加的数字,这样第二个数字只需与其左边的第一个数字比较后排好序;在第三个数字,认为前两个已经排好序的数字为手里整理好的牌,那么只需将第三个数字与前两个数字比较即可;以此类推,直到最后一个数字与前面的所有数字比较结束,插入排序完成。
对于算法正确性的复杂度分析这个部分,书本上写的很详细,而且那么多公式推导敲起来实在很累人,所以我就偷懒不再赘述了。
结论是:
- 对于最好的情况,运行时间为T(n)=an+b,是n的线性函数;
- 对于最差的情况,运行时间为T(n)=an^2+bn+c,是n的二次函数;
- 对于平均的情况,平均情况往往与最坏情况大致一样差,也是输入规模的一个二次函数。
因此,我们可以说,对于插入排序来讲,其算法复杂度为O(n^2)。
2.代码实现(C/C++,Java,Python)
C
#include <stdio.h>
#include <stdlib.h>
int main() {
int *array, i, j, len, key;
printf("Enter the length of array: ");
scanf("%d\n", &len);
array = (int* )malloc(len * sizeof(int));
for(i = 0; i < len; i++)
scanf("%d", &array[i]);
for(i = 1; i < len; i++) {
key = array[i];
j = i - 1;
while(j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j = j - 1;
}
array[j + 1] = key;
}
for(i = 0; i < len; i++)
printf("%d ", array[i]);
printf("\n");
free(array);
return 0;
}
C++
#include <iostream>
#include <vector>
using namespace std;
void display(vector<int> &array){
for(vector<int>::iterator it = array.begin(); it < array.end(); it++)
cout << *it << " ";
}
int main() {
vector<int> array;
int len, element, key;
cout << "Enter the length of array: ";
cin >> len;
cout << "Enter the element of array: ";
for(int i = 0; i < len; i++) {
cin >> element;
array.push_back(element);
}
for(int j = 1; j < len; j++) {
key = array[j];
int k = j - 1;
while(k >= 0 && array[k] > key) {
array[k + 1] = array[k];
k -= 1;
}
array[k + 1] = key;
}
display(array);
return 0;
}
Java
import java.util.*;
public class insertion_sort {
public static void display(Iterator<Integer> it) {
while(it.hasNext()) {
Integer element = it.next();
System.out.print(element + " ");
}
System.out.println();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
ArrayList<Integer> array = new ArrayList<Integer>();
System.out.print("Enter the length of array: ");
int len = in.nextInt();
for(int i = 0; i < len; i++)
array.add(in.nextInt());
Sort arraySort = new Sort(array);
arraySort.sortInsertion();
display(array.iterator());
}
}
class Sort{
public Sort(ArrayList<Integer> array) {
this.array = array;
}
public ArrayList<Integer> sortInsertion() {
len = array.size();
for(int i = 0; i < len; i++) {
key = array.get(i);
int j = i - 1;
while(j >= 0 && array.get(j) > key) {
array.set(j + 1, array.get(j));
j -= 1;
}
array.set(j + 1, key);
}
return array;
}
private ArrayList<Integer> array;
private int len;
private int key;
}
Python
a = [8, 4, 6, 1, 0, 9, 3, 2]
for i in range(1, len(a)):
key = a[i]
j = i - 1
while j >= 0 and a[j] > key:
a[j + 1] = a[j]
j = j - 1
a[j + 1] = key
print a