zoukankan      html  css  js  c++  java
  • 数据结构

    版权声明:本文为博主原创文章,未经博主同意不得转载。

    https://blog.csdn.net/u012515223/article/details/24323125

    表插入排序 具体解释 及 代码(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 
    







查看全文
  • 相关阅读:
    Asp.Net Web API 2第八课——Web API 2中的属性路由
    Asp.Net Web API 2第七课——Web API异常处理
    Asp.Net Web API 2第六课——Web API路由和动作选择
    Asp.Net Web API 2第五课——Web API路由
    开始学习python
    BMI 小程序 购物车
    深浅copy 文件操作
    字典 dict 集合set
    基本数据类型 (str,int,bool,tuple,)
    python 运算符
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10790292.html
  • Copyright © 2011-2022 走看看