您的位置:首页 > 其它

插入排序之表插入排序

2015-07-26 12:57 399 查看
1.表插入排序只是求得一个有序的链表,它是修改指针的值来代替移动记录,操作过程如下



2.但是这样只能进行顺序查找,不能进行随机查找,为了能实现有序表的折半查找,需要对记录进行重新排列。操作过程如下:



3.测试程序如下:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef struct xxx{
int head;//头结点
int a[100];
int next[100];//记录下一个元素的位置
int len;
xxx(){
head = 1;
memset(next, 0, sizeof(next));
}
void outList(){
for(int i=1; i<=len; ++i){
cout<<a[i]<<" ";
}
cout<<endl;
}
}Listx;

Listx Lx;

void table_insertion_sort(){//表插入排序,相当于静态链表
for(int i=2; i<=Lx.len; ++i){
int pre, p;
for(p=Lx.head; p && Lx.a[p]<Lx.a[i]; pre=p, p=Lx.next[p]);
if(p==0){
Lx.next[pre] = i;
} else if(p==Lx.head){
Lx.next[i] = Lx.head;
Lx.head = i;
} else {
Lx.next[pre] = i;
Lx.next[i] = p;
}
}
//输出
for(int i=Lx.head; i; i = Lx.next[i])
cout<<Lx.a[i]<<" ";
cout<<endl;
}

void arrang_table() {
int p = Lx.head, q;
for(int i=1; i<Lx.len; ++i){
while(p < i) p = Lx.next[p];//第i个记录在表中的位置不应该小于 i,如果小于i,说明该元素已经被交换位置了,可以通过next继续寻找
q = Lx.next[p];//指向下一个节点
if(p!=i){//第p个元素应该在第i个位置
swap(Lx.a[i], Lx.a[p]);
swap(Lx.next[i], Lx.next[p]);
Lx.next[i] = p;//该元素之前的位置 p,指向被移走的记录,使得以后可由while循环找回
}
p = q;
}

for(int i=1; i<=Lx.len; ++i)
cout<<Lx.a[i]<<" ";
cout<<endl;
}

int main()
{
int i;
scanf("%d", &Lx.len);
for(i=1; i<=Lx.len; i++)
scanf("%d", &Lx.a[i]);
table_insertion_sort();
arrang_table();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: