您的位置:首页 > 其它

12. 分配排序

2014-08-09 15:21 281 查看
分配排序

分配排序是基于分配和收集的排序方法。其基本思想是:先将待排序记录序列分配到不同的桶里,然后在把各桶中的记录依次收集在一起。

桶式排序

桶式排序是一种简单的分配排序,其基本思想是:假设带排序记录的值都在0~m-1之间,设置m个桶,首先将值为i的记录分配到第i个桶中,然后在将各个桶中的记录依次收集起来。

void bucketSort(int arr[], int n,int m)//n为序列中元素的个数,m为序列中最大的元素的值。
{
//定义一个数组,存放各数字出现的次数。初始值均赋值为0
vector<int>times = { 0 };
times.resize(m + 1);

//定义一个临时数组
int *tempArry=new int
;

//统计各数字出现的次数
for (int i = 0; i<n; i++)
{
times[arr[i]]++;

}

//重新组织存放出现次数的数组
for (int i = 1; i<m + 1; i++)
{
times[i] += times[i - 1];
}

//从后向前对元素进行收集
for (int i = n - 1; i >= 0; i--)
{
tempArry[--times[arr[i]]] = arr[i];
}

//把临时数组中的元素复制到原数组中
for (int i = 0; i<n; i++)
{
arr[i] = tempArry[i];
}

delete[] tempArry;
}


struct Node //定义静态链表存储待排序记录序列
{
int key;//键值
int next;//下一个键值在数组中的下标
}; struct QueueNode//定义静态链队列存储桶
{
int front;  //指向队头元素在数组中的下标
int rear;  //指向队尾元素在数组中的下标
};
void Distribute(Node r[], int n, QueueNode q[], int m,int &first)//first为静态链表的头指针,从下标0开始存储带排序序列
{
int i = first;
int k;
while (r[i].next != -1)
{
k = r[i].key;
if (q[k].front == -1)
q[k].front = i;
else
{
r[q[k].rear].next = i;
}
q[k].rear = i;
i = r[i].next;
}
//静态链表中的最后一个元素的next指必为-1,故上述循环不会对其操作
//所以在循环结束后,还需对最后一个元素进行手动操作
k = r[i].key;
if (q[k].front == -1)
q[k].front = i;
else
{
r[q[k].rear].next = i;
}
q[k].rear = i;

}

void Collect(Node r[], int n, QueueNode q[], int m, int &first)
{
int k = 0;
int last;
while (q[k].front == -1) //找到第一个非空队列
{
k++;
}
first = q[k].front;
last = q[k].rear;
while (k<m-1)             //将所有的队列首尾相接
{
k++;
if (q[k].front != -1)
{
r[last].next = q[k].front;
last = q[k].rear;

}
}
r[last].next = -1;

}
void BucketSort(Node r[], QueueNode q[], int n, int m)
{
for (int i = 0; i<n; i++) //初始化静态链表
{
r[i].next = i + 1;
}
r[n - 1].next = -1;
for (int i = 0; i < m; i++)//初始化静态队列
{
q[i].front = -1;
q[i].rear = -1;
}
int first = 0;
Distribute(r, n, q, m, first);
Collect(r, n, q, m, first);
while (r[first].next != -1)
{
cout << r[first].key << " ";
first = r[first].next;
}
cout << r[first].key;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: