算法名 | 桶排序 |
分类 | 排序算法 |
复杂度 | 线性(消耗存储空间较大) |
实现形式 | 单链表 |
特性 | 原址排序 |
具体参考出处 | 《算法导论》 |
// 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;
}