表插入排序

本文介绍了一种使用表格插入法实现的排序算法,并提供了完整的C语言源代码。该算法通过构建节点链表的方式进行排序,适用于计算机科学领域的学习与研究。

TableInsertSort.c

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

typedef struct//data struction
{
	int data;
	int next;
}Node, *NodePtr;

static NodePtr nodePtr = NULL;
static int *iArrayTemp = NULL; 
static int iArrayLen;

void alloc()
{
	if((nodePtr = (NodePtr) malloc(iArrayLen * sizeof(Node))) == NULL)
	{
		fprintf(stderr, "allocate error !");
		exit(1);
	}
}

void init()
{
	int i;

	nodePtr[0].data = INT_MAX;
	nodePtr[0].next = 1;
	nodePtr[1].data = iArrayTemp[0];
	nodePtr[1].next = 0;

	//printf("%d,", nodePtr[1].data);
	for(i = 2; i < iArrayLen + 1; i++)
	{
		nodePtr[i].data = iArrayTemp[i - 1];
		//printf("%d,", nodePtr[i].data);
	}
	//printf("\n");
}

void TabInsertSort(int iList[], int iLen)
{
	int i;
	int iCurrentPtr;
	int iForePtr;
	int iFlag = 0;

	iArrayTemp = iList;
	iArrayLen = iLen;

	alloc();//allocate space
	init();

	for(i = 2; i < iArrayLen + 1; i++)//start from the second one 
	{
		iCurrentPtr = nodePtr[0].next;//pointer point to the first
		iForePtr = 0;

		while(1)
		{
			//printf("nodePtr[%d].data:%d : ", iCurrentPtr, nodePtr[iCurrentPtr].data);
			//printf("nodePtr[%d].data:%d\n", i, nodePtr[i].data);
			if(nodePtr[iCurrentPtr].data > nodePtr[i].data)
			{
				nodePtr[i].next = iCurrentPtr;
				nodePtr[iForePtr].next = i;
				if(iFlag == 1)
				{
					break;
				}
				else
				{
					nodePtr[0].next = i;	
					iFlag = 0;
					break;
				}
			}
			else if(nodePtr[iCurrentPtr].data < nodePtr[i].data)
			{
				iFlag = 1;
				if(nodePtr[iCurrentPtr].next != 0)
				{
					iCurrentPtr = nodePtr[iCurrentPtr].next;//change iCurrentPtr for moving the next one
					iForePtr = nodePtr[iForePtr].next;
				}
				else
				{
					nodePtr[i].next = 0;
					nodePtr[iCurrentPtr].next = i;
					break;
				}
			}
		}
	}

	iCurrentPtr = nodePtr[0].next;
	for(i = 0; i < iArrayLen; i++)
	{
		iList[i] = nodePtr[iCurrentPtr].data;
		iCurrentPtr = nodePtr[iCurrentPtr].next;
	}
}
main.c

#include <stdio.h>

int iList[] = {34, 23, 4, 87, 11, 12, 15, 43, 92};

int main(void)
{
	void TabInsertSort(int iList[], int iLen);
	int iLen = sizeof(iList) / sizeof(iList[0]);
	int i;

	TabInsertSort(iList, iLen);
	//printf("iLen = %d\n", iLen);

	for(i = 0; i < iLen; i++)
	{
		printf(i == iLen - 1 ? "%d\n" : "%d,", iList[i]);
	}
	return 0;
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值