简单的桶式排序,有两种实现方式:
1:基于数组实现---主要原理,创建一个大小为将要排序的整数序列中最大数的数组,将数组每个元素置为0,然后将整数序列和数组下标一致时,执行加加操作,最后再循环这个数组,判断数组中大于0的,就代表是序列中的,并执行减减操作,此时出现的数组下标就是排好的目标序列。
#pragma mark---基于数组的桶式排序
int find_max(int A[],int N){
int max=A[0];
for (int i=0; i<N; i++) {
if (A[i]>max) {
max=A[i];
}
}
return max;
}
void bucket_sort(int A[],int N){
int M=find_max(A, N);//寻找到最大数
int count[M+1];//创建数组
for (int i=0; i<=M; i++) {//循环将所有元素置为0
count[i]=0;
}
for (int i=0; i<N; i++) {//将数组中的整数序列中存在的元素加加,A[i]就是数组的下标
count[A[i]]++;
}
for (int i=0; i<=M; i++) {//遍历数组
while (count[i]>0) {//判断元素是否大于0,是的话,i就是序列中的一员,将i拿出来,就是排好的序列
count[i]--;
}
}
}
int main(int argc, const char * argv[]) {
int A[]={1,4,2,6,1,0,7,10,9,23,24,25};
bucket_sort(A, 10);
return 0;
}
2基于链表的桶式排序:
#pragma mark---基于链表的桶式排序
void bucket_sort_list(int A[],int N){
int M=find_max(A, N);
list count[M+1],l;
for (int i=0; i<=M; i++) {
count[i]=create_list();
}
for (int i=0; i<N; i++) {
insert_to_tail(A[i], count[A[i]]);
}
for (int i=0; i<=M; i++) {
for (l=count[i]->next; l!=NULL; l=l->next) {
printf("%d ", l->data);
}
}
printf("\n");
}
#pragma mark---单链表文件
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <mm_malloc.h>
list create_list(){
list l;
l=(list)malloc(sizeof(struct node));
if (l==NULL) {
perror("malloc error");
exit(1);
}
l->next=NULL;
return l;
}
void insert(int x,list l,position p){
position newNode;
newNode=(list)malloc(sizeof(struct node));
if (newNode==NULL) {
perror("malloc error");
exit(1);
}
newNode->data=x;
newNode->next=p->next;
p->next=newNode;
}
void insert_to_head(int x,list l){
insert(x, l, l);
}
void insert_to_tail(int x,list l){
ptr_to_node nptr;
nptr=l;
while (nptr->next!=NULL) {
nptr=nptr->next;
}
insert(x, l, nptr);
}