《算法导论》学习笔记——插入排序

插入排序

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
posted @ 2015-01-16 18:23  ZhxBao的博客  阅读(728)  评论(0编辑  收藏  举报