1、测试代码
#include <iostream>
using namespace std;
int g_loop = 0; /* 循环计数 */
int g_move = 0; /* 数据移动次数 */
void output_info(int *buff,int len, int flag)
{
int i;
if(0 == flag)
{
cout << "before: ";
}
else
{
cout << "after: ";
}
for(i = 0; i < len; ++i)
{
cout << *(buff + i) << " ";
}
cout << endl;
}
/* 快速排序 */
void fast_sort(int *buff, int left, int right)
{
if(left >= right)
{
return;
}
int i = left;
int j = right;
int key = buff[left];
while(i < j)
{
while(i < j && key <= buff[j])
{
j--;
}
buff[i] = buff[j];
while(i < j && key >= buff[i])
{
i++;
}
buff[j] = buff[i];
}
buff[i] = key;
fast_sort(buff, left, i - 1);
fast_sort(buff, i + 1, right);
}
/* 取出桶中数据回填 */
void clean_barrel(int arr[],int **barrel,int pos[])
{
int i,j,k;
k = 0;
for ( i = 0; i < 2; ++i)
{
for ( j = 0; j < pos[i]; ++j)
{
arr[k++] = barrel[i][j];
}
pos[i] = 0;
}
}
/* 桶排序 */
void bucket_sort(int arr[], int len)
{
int max;
int min;
int mid;
int i;
int *barrel[2]; /* 桶指针 */
int pos[2] = {0}; /* 保存数组索引值 */
max = min = arr[0];
for(i = 1; i < len; ++i)
{
if(arr[i] > max)
{
max = arr[i];
}
if(arr[i] < min)
{
min = arr[i];
}
}
mid = min + (max - min) / 2;
cout << "min=" << min << endl;
cout << "mid=" << mid << endl;
cout << "max=" << max << endl;
// 创建2个桶
for(i = 0; i < 2; ++i)
{
barrel[i] = new int[len]();
}
// 放入数据
for(i = 0; i < len; ++i)
{
if(arr[i] <= mid)
{
barrel[0][pos[0]++] = arr[i];
}
else
{
barrel[1][pos[1]++] = arr[i];
}
}
// 对桶里的数据进行排序
fast_sort(barrel[0], 0, pos[0] - 1);
fast_sort(barrel[1], 0, pos[1] - 1);
// 取出桶中的数据放回原数组
output_info(arr, len, 0);
clean_barrel(arr, barrel, pos);
output_info(arr, len, 1);
// 释放桶资源
for(i = 0; i < 2; ++i)
{
delete[] barrel[i];
}
}
int main(void)
{
int array[10]= {10,9,8,7,6,10,9,8,7,6};
int len = sizeof(array) / sizeof(array[0]);
bucket_sort(array, len);
return 0;
}
2、测试log
min=6
mid=8
max=10
before: 10 9 8 7 6 10 9 8 7 6
after: 6 6 7 7 8 8 9 9 10 10
3、算法分析
- 非原地排序算法;
- 稳定排序算法;
- 空间复杂度 O(n+k);
- 时间复杂度 O(n+k)。