现在的位置: 首页 > 综合 > 正文

C语言实现表插入排序

2017年10月22日 ⁄ 综合 ⁄ 共 1200字 ⁄ 字号 评论关闭

表插入排序的基础知识参考:插入排序(内部排序)

#include <stdio.h>

#define INIT_MAX 65535						//表头结点data最大值
#define SIZE 10								// 静态链表容量
typedef struct 
{											// 表结点类型
	int data;								// 记录项
    int next;								// 指针项
}SLNode;

typedef struct
{											// 静态链表类型
	SLNode r[SIZE + 1];						//0号单元为表头结点
	int length;								//链表当前长度
}SLinkListType;

void TableInsert(SLinkListType &SL, int D[], int n)			//由数组D建立n个元素的表插入排序的静态链表SL
{
	int p, q;
	SL.r[0].data = INIT_MAX;
	SL.r[0].next = 0;										// next域为0表示表尾(现为空表,初始化)
	for(int i = 0; i < n; i++)
	{
		SL.r[i+1].data = D[i];								// 将数组D的值赋给静态链表SL
		p = SL.r[0].next;
		q = 0;   
		while (SL.r[p].data < SL.r[i+1].data)
		{													// 静态链表向后移
			q = p;  
			p = SL.r[p].next;
		}
		
		SL.r[i+1].next = p;									//将当前记录插入静态链表
		SL.r[q].next = i + 1;
	}
	SL.length = n;

	return;
}

void Arrange(SLinkListType &SL)			//根据静态链表SL中各结点的指针值调整记录位置,使得SL中记录按关键字非递减有序顺序排列 
{											
	int p, q, temp;
	p = SL.r[0].next;					// p指示第一个记录的当前位置
	for(int i = 1; i < SL.length; i++)
	{									// SL.r[1..i-1]中记录已按关键字有序排列,第i个记录在SL中的当前位置应不小于i
		while(p < i) 
		{
			p = SL.r[p].next;			// 找到第i个记录,并用p指示其在SL中当前位置
		}
		q = SL.r[p].next;					//q指示尚未调整的表尾
		
		if (p != i)
		{ 
			temp = SL.r[p].data;
			SL.r[p].data = SL.r[i].data;
			SL.r[i].data = temp;			//交换记录,使第i个记录到位
			SL.r[p].next = SL.r[i].next;
			SL.r[i].next = p;				//指向被移走的记录,使得以后可由while循环找回
		}
		p = q;								//p指示尚未调整的表尾,为找第i+1个记录作准备
	}

	return;
}

int main(void)
{
	SLinkListType SL;
	int D[] = {10, 9, 8, 7, 6, 5};
	
	TableInsert(SL, D, 6);
	Arrange(SL);

	for (int i = 0; i < SL.length; i++)
	{
		printf("%d ", SL.r[i + 1].data);
	}
	printf("\n");

	return 0;
}

抱歉!评论已关闭.