add by jinshaohui for bucket sort
This commit is contained in:
parent
b6856524e7
commit
1acc704483
100
c-cpp/13_sorts/sort.c
Normal file → Executable file
100
c-cpp/13_sorts/sort.c
Normal file → Executable file
@ -158,11 +158,111 @@ void radix_sort_test()
|
||||
return;
|
||||
}
|
||||
|
||||
struct barrel {
|
||||
int node[10];
|
||||
int count;/* the num of node */
|
||||
};
|
||||
int partition(int a[],int left,int right)
|
||||
{
|
||||
int i = left;
|
||||
int j = right;
|
||||
int key = a[left];
|
||||
|
||||
while(i < j)
|
||||
{
|
||||
while((i < j)&& (a[j] >= key))
|
||||
{
|
||||
j--;
|
||||
}
|
||||
if (i < j)
|
||||
{
|
||||
a[i] = a[j];
|
||||
}
|
||||
while((i < j) && a[i] <= key)
|
||||
{
|
||||
i++;
|
||||
}
|
||||
|
||||
if (i<j)
|
||||
{
|
||||
a[j] = a[i];
|
||||
}
|
||||
}
|
||||
a[i] = key;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
void quick_sort(int a[],int left,int right)
|
||||
{
|
||||
int q = 0;
|
||||
/*递归终止条件*/
|
||||
if (left >= right)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
q = partition(a,left,right);
|
||||
quick_sort(a,left,(q - 1));
|
||||
quick_sort(a,(q + 1),right);
|
||||
return;
|
||||
}
|
||||
|
||||
void bucket_sort(int data[], int size)
|
||||
{
|
||||
int max, min, num, pos;
|
||||
int i, j, k;
|
||||
struct barrel *pBarrel;
|
||||
|
||||
max = min = data[0];
|
||||
for (i = 1; i < size; i++) {
|
||||
if (data[i] > max) {
|
||||
max = data[i];
|
||||
} else if (data[i] < min) {
|
||||
min = data[i];
|
||||
}
|
||||
}
|
||||
num = (max - min + 1) / 10 + 1;
|
||||
pBarrel = (struct barrel*)malloc(sizeof(struct barrel) * num);
|
||||
memset(pBarrel, 0, sizeof(struct barrel) * num);
|
||||
|
||||
/* put data[i] into barrel which it belong to */
|
||||
for (i = 0; i < size; i++) {
|
||||
k = (data[i] - min + 1) / 10;/* calculate the index of data[i] in barrel */
|
||||
(pBarrel + k)->node[(pBarrel + k)->count] = data[i];
|
||||
(pBarrel + k)->count++;
|
||||
}
|
||||
|
||||
pos = 0;
|
||||
for (i = 0; i < num; i++) {
|
||||
if ((pBarrel + i)->count != 0)
|
||||
{
|
||||
quick_sort((pBarrel+i)->node, 0, ((pBarrel+i)->count)-1);/* sort node in every barrel */
|
||||
|
||||
for (j = 0; j < (pBarrel+i)->count; j++) {
|
||||
data[pos++] = (pBarrel+i)->node[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
free(pBarrel);
|
||||
}
|
||||
|
||||
void bucket_sort_test()
|
||||
{
|
||||
int a[] = {78, 17, 39, 26, 72, 94, 21, 12, 23, 91};
|
||||
int size = sizeof(a) / sizeof(int);
|
||||
printf("\r\n bucket sort test ...");
|
||||
bucket_sort(a, size);
|
||||
dump(a,size);
|
||||
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
count_sort_test();
|
||||
|
||||
radix_sort_test();
|
||||
|
||||
bucket_sort_test();
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user