数据结构 - 表插入排序 详解 及 代码(C++)

来源:互联网 发布:阿里云个人邮箱登录 编辑:程序博客网 时间:2024/06/04 01:34

表插入排序 详解 及 代码(C++)


本文地址: http://blog.csdn.net/caroline_wendy/article/details/24323125


表插入排序(List Insertion Sort)是使用静态链表进行插入排序, 每次插入修改指针项, 通过指针项的链接顺序, 使静态链表有序.

修改2n次指针, 代替移动2n次数据, 因为每次修改2个指针值(代码中可见), 但比较次数仍为O(n^2);

重排记录: 3(n-1)次记录移动, 记录需要交换,一次交换式三次移动数据

所以时间复杂度为O(n^2).


实例代码为C++, 使用2个数组, 清晰的显示了值域和指针域.

代码:

/* * test.cpp * *  Created on: 2014.04.22 *      Author: Spike *//*eclipse cdt, gcc 4.8.1*/#include <iostream>#include <climits>#include <deque>using namespace std;//打印排序的序列void printSeq(const std::deque<int>& vals, std::deque<int>& ptrs) {int t = 0;for (std::size_t i=0; i<vals.size(); ++i) {t = ptrs[t];std::cout << vals[t] << " ";if (ptrs[t] == 0) {break;}}std::cout << std::endl;}//打印数组void print(const std::deque<int>& L) {for (auto i : L) {std::cout << i << " ";}std::cout << std::endl;}//表插入排序void ListInsertSort(const std::deque<int>& vals, std::deque<int>& ptrs) {const int length(vals.size());ptrs.resize(length);ptrs[0] = 1;ptrs[1] = 0;for (int i=2; i<length; ++i) {int t = 0; //从0开始查找int pre = 0; //记录前一个指针for (int j=0; j<i-1; ++j) {t = ptrs[t]; //找到指针的位置if (vals[t] > vals[i]) { //小于插到后面ptrs[i] = t;ptrs[pre] = i;break; //终止} else if (ptrs[t] == 0) { //末尾, 直接插入前面ptrs[i] = 0;ptrs[t] = i;}pre = t; //记录指针}//测试std::cout << "Pointer: "; print(ptrs);}}//重排记录void Arrange(std::deque<int>& vals, std::deque<int>& ptrs) {const int length(vals.size());int t = 0;int pre = 0;t = ptrs[t];for (int i=1; i<length; ++i) {while( t<=i && t!=0) { //顺次找到结点t = ptrs[t];}if(t == 0)break;pre = ptrs[t];if (t != i) { //交换值, 交换指针int temp = vals[t];vals[t] = vals[i];vals[i] = temp;int temp2 = ptrs[i];ptrs[i] = t;ptrs[t] = temp2;}t = pre;std::cout << "Pointer: "; print(ptrs);}}int main(void) {std::deque<int> vals = {INT_MAX, 49, 38, 65, 97, 76, 13, 27, 49};std::deque<int> ptrs;print(vals);ListInsertSort(vals, ptrs);printSeq(vals, ptrs);Arrange(vals, ptrs);print(vals);return 0;}

输出:

2147483647 49 38 65 97 76 13 27 49 Pointer: 2 0 1 0 0 0 0 0 0 Pointer: 2 3 1 0 0 0 0 0 0 Pointer: 2 3 1 4 0 0 0 0 0 Pointer: 2 3 1 5 0 4 0 0 0 Pointer: 6 3 1 5 0 4 2 0 0 Pointer: 6 3 1 5 0 4 7 2 0 Pointer: 6 8 1 5 0 4 7 2 3 13 27 38 49 49 65 76 97 Pointer: 6 6 1 5 0 4 8 2 3 Pointer: 6 6 7 5 0 4 8 1 3 Pointer: 6 6 7 7 0 4 8 5 3 Pointer: 6 6 7 7 6 4 0 5 3 Pointer: 6 6 7 7 6 8 0 5 4 Pointer: 6 6 7 7 6 8 7 0 4 Pointer: 6 6 7 7 6 8 7 8 0 2147483647 13 27 38 49 49 65 76 97 







10 0
原创粉丝点击