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 
    







查看全文
  • 相关阅读:
    docker安装
    快速删除docker中的容器
    CentOS赋予一个普通用户root权限
    大型电商网站:第三章:环境搭建
    面试:第十一章:缓存
    面试:第十章:单点登录
    面试:第九章:分布式 、高并发、集群、负载均衡、高可用
    面试:第八章:SpringMVC、Springboot、Mybatis、Dubbo、Zookeeper、Redis、Elasticsearch、Nginx 、Fastdfs、ActiveMQ
    面试:第七章:冷门面试题
    大型电商网站:第一章:主要电商模式
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10790292.html
  • Copyright © 2011-2022 走看看