[排序]桶排序算法实现


算法名桶排序
分类排序算法
复杂度线性(消耗存储空间较大)
实现形式单链表
特性原址排序
具体参考出处《算法导论》
// bucket_sort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>

#define data_num 1000

struct one_dir_store
{
	int value;
	one_dir_store* next_link;
};


int _tmain(int argc, _TCHAR* argv[])
{
	int i, j, k;
	unsigned char data_array[data_num];
	one_dir_store* search_array[10];
	one_dir_store* p_new;
	one_dir_store* p_pre;//现在的指针
	one_dir_store* p_next;//现在的指针指向的下一个指针
	one_dir_store* p_curr;

	//索引矩阵初始化
	for (i = 0; i < 10; i++)
	{
		search_array[i] = (one_dir_store*)malloc(sizeof(one_dir_store));
		search_array[i]->value = i*10;
		search_array[i]->next_link = NULL;
	}

	srand(10000);
	for (i = 0; i < data_num; i++)
	{
		data_array[i] = rand()%100;
		printf("%d ", data_array[i]);
	}
	printf("\n\n");

	//开始插入排序
	int index = 0;
	int data = 0;
	for (i = 0; i < data_num; i++)
	{
		index	= data_array[i] / 10;//获取索引号
		data	= data_array[i];
		p_new = (one_dir_store*)malloc(sizeof(one_dir_store));
		p_new->value		= data;
		p_new->next_link	= NULL;

		if (search_array[index]->next_link == NULL)
		{
			//首个元素
			search_array[index]->next_link = p_new;
		}
		else
		{
			p_pre	= search_array[index];			
			p_curr	= search_array[index]->next_link; //从第一个数据开始作为指针启动

			//后面已无数据
			if (p_curr->next_link == NULL)
			{
				p_next = NULL;
			}
			else p_next = p_curr->next_link;
			
			while (1)
			{
				//后面已无数据
				if (p_next == NULL)
				{
					if (data> p_curr->value)
					{
						p_curr->next_link = p_new;
						break;
					}
					else
					{
						//插入操作
						p_pre->next_link = p_new;
						p_new->next_link = p_curr;
						break;
					}
				}
				else//后面有数据
				{
					//<=curr
					if (data <= p_curr->value)
					{
						//插入操作
						p_pre->next_link = p_new;
						p_new->next_link = p_curr;
						break;
					}
					else if (data > p_curr->value && data <= p_next->value)
					{
						//插入操作
						p_curr->next_link	= p_new;
						p_new->next_link	= p_next;
						break;
					}
					else
					{
						p_pre = p_curr;
						p_curr = p_next;

						//后面已无数据
						if (p_next->next_link == NULL)
						{
							p_next = NULL;
						}
						else p_next = p_next->next_link;
					}
				}
			}//while(1);
			
		}

	}//for


	int count = 0;
	for (i = 0; i < 10; i++)
	{
		if (search_array[i]->next_link != NULL)
		{
			p_curr = search_array[i]->next_link;
		}
		else continue;
		
		while (1)
		{
			printf("%d ", p_curr->value);
			count++;
			if (p_curr->next_link != NULL)
			{
				p_curr = p_curr->next_link;
			}
			else break;
		}
	}
	printf("\n\n %d",count);

	i = 0;

	system("pause");
	return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值