【算法导论】插入排序实现
2014-03-03 21:03
363 查看
#ifndef INSERTION_SORT_H #define INSERTION_SORT_H #include <iterator> ////////////////////////////////////////////////////////////////////////// // 插入排序: // 最坏情况:逆序数组 cn^2 + n = n^2 + n // 一般情况:n(n-1)/2 = n^2 - n // 最好情况:已经排好序的数组 cn // 如果用户经常遇到上面的最坏情况,我们稍微做了一些优化 // 使用smart_insertion_sort会稍微加快速度,但是如果并不是经常 // 遇到,还是不要用smart比较好 ////////////////////////////////////////////////////////////////////////// template <typename Iterator> void smart_insertion_sort(Iterator first, Iterator last) { // 如果成立,那么很可能是正向排序情况比较多的 if (*first < *last) { insertion_sort(first, last); } // 如果不成立,那么很可能是反向排序情况比较多的 else { reverse_insertion_sort(first, last); // 这时再将数组反转 reverse(first, last); } } // 我们假设从小到大排列是默认的正向排列 template <typename Iterator> void insertion_sort(Iterator first, Iterator last) { // 用到了一点template编程的技巧 insertion_sort_aux(first, last, std::_Val_type(first)); } template <typename Iterator, typename T> void insertion_sort_aux(Iterator first, Iterator last, T*) { /************************************************************************/ /* 算法思维方式: 从第二个位置开始向后遍历整个数组 从每个遍历的位置开始 往前遍历已经排好序的部分 使得这个位置也成为已经排好序的部分 */ /************************************************************************/ for (Iterator iter = first + 1; iter != last; ++iter) { for (Iterator cur = iter; cur != first; --cur) { if (*(cur - 1) > *cur) { T tmp = *cur; *cur = *(cur - 1); *(cur - 1) = tmp; } } } /************************************************************************/ /* (循环不变式)loop invariant: 初始化:i是2,左边是1,只有一个元素,显然是排好序的 保持:对于每个i,总要找到第一个比自己小的元素,并放在它的右边,而对于左边的所有元素 都是排好序的,所以每次遍历都能保证被遍历的元素排序了 终止:i终止于length[Array]+1,而因为i左边的元素都是排好序的,所以数组被排好序了 */ /************************************************************************/ } // 因为我们假设从小到大排序是正向,所以从大到小是反向 template <typename Iterator> void reverse_insertion_sort(Iterator first, Iterator last) { reverse_insertion_sort_aux(first, last, std::_Val_type(first)); } template <typename Iterator, typename T> void reverse_insertion_sort_aux(Iterator first, Iterator last, T*) { /************************************************************************/ /* 算法原理: 同上 */ /************************************************************************/ for (Iterator iter = first + 1; iter != last; ++iter) { for (Iterator cur = iter; cur != first; --cur) { if (*(cur - 1) < *cur) { T tmp = *cur; *cur = *(cur - 1); *(cur - 1) = tmp; } } } /************************************************************************/ /* loop invariant: 同上 */ /************************************************************************/ } #endif // INSRTION_SORT_H
相关文章推荐
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- 【算法导论】【第二章】VC++实现插入排序
- 算法导论—插入排序及Matlab实现
- 算法导论学习笔记——插入排序
- python实现基础排序算法之(插入排序)
- 二叉查找树——算法导论第12章简易代码实现~
- 算法 插入排序 C++实现
- [算法导论] 快速排序以及最大堆的C++实现
- 算法 之 插入排序 的 JS 实现
- 算法导论详解(1) 第二章算法基础+python实现
- Java实现算法导论中Miller-Rabin随机性素数测试
- 【算法导论】第二章之插入排序
- 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)
- 算法导论——JAVA实现“插入排序”算法
- C++ 归并排序实现(算法导论)
- 【算法导论】笔记一(插入排序、归并排序、选择排序、Peek Finding、加法器、中英文字符串搜索)
- 【算法导论学习-001】插入排序(InsertionSort)
- 【算法导论】快速排序java实现