c语言 静态链表插入排序,数据结构 - 表插入排序 具体解释 及 代码(C++)

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

#include

#include

using namespace std;

//打印排序的序列

void printSeq(const std::deque& vals, std::deque& ptrs) {

int t = 0;

for (std::size_t i=0; i

t = ptrs[t];

std::cout << vals[t] << " ";

if (ptrs[t] == 0) {

break;

}

}

std::cout << std::endl;

}

//打印数组

void print(const std::deque& L) {

for (auto i : L) {

std::cout << i << " ";

}

std::cout << std::endl;

}

//表插入排序

void ListInsertSort(const std::deque& vals, std::deque& ptrs) {

const int length(vals.size());

ptrs.resize(length);

ptrs[0] = 1;

ptrs[1] = 0;

for (int i=2; i

int t = 0; //从0開始查找

int pre = 0; //记录前一个指针

for (int j=0; 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& vals, std::deque& ptrs) {

const int length(vals.size());

int t = 0;

int pre = 0;

t = ptrs[t];

for (int i=1; 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 vals = {INT_MAX, 49, 38, 65, 97, 76, 13, 27, 49};

std::deque 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

2a0f9612cbd20121fae87a9e7c1f2299.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值