排序演算法__桶排序
排序演算法__桶排序
一、介紹
桶排序是將待排序集合中處於同一個值域的元素存入同一個桶中,也就是根據元素值特性將集合拆分為多個區域,則拆分後形成的多個桶,從值域上看是處於有序狀態的。對每個桶中元素進行排序,則所有桶中元素構成的集合是已排序的。桶排序更是對計數排序的改進,計數排序申請的額外空間跨度從最小元素值到最大元素值,若待排序集合中元素不是依次遞增的,則必然有空間浪費情況。桶排序則是弱化了這種浪費情況,將最小值到最大值之間的每一個位置申請空間,更新為最小值到最大值之間每一個固定區域申請空間,儘量減少了元素值大小不連續情況下的空間浪費情況。
二、C++實現
#include<iostream>
using namespace std;
const int N=1000;
struct Node{
int data;
Node *next;
Node(int data=0)
{
this->data=data;
this->next=NULL;
}
};
//hash函式
int hash(int value)
{
return value/10;//簡單地將數整除10
}
//刪除結點
void deleteNode(Node *node)
{
if(!node)
{
if(!node->next) deleteNode(node->next);//如果node結點還有下一個結點就遞迴刪除
delete(node);//刪除此結點
}
}
//桶排序
void bucketSort(int array[],int n,int bucketNum/*桶的數目*/)
{
int ans[N];//排序後的結果
Node *bucket[N];
for(int i=0;i<bucketNum;i++)
{
bucket[i]=new Node();
if(!bucket[i])
{
cout<<"記憶體分配失敗!"<<endl;
exit(-1);
}
}
for(int i=0;i<n;i++)
{
int pos=hash(array[i]);//判斷此數應該放在哪個桶中
Node *p=bucket[pos];
Node *node=new Node(array[i]);
if(!node)
{
cout<<"記憶體分配失敗!"<<endl;
exit(-1);
}
if(!p->next)//沒有元素
p->next=node;
else
{
//尋找node應該插入的位置
while(p->next&&p->next->data<node->data) p=p->next;
node->next=p->next;
p->next=node;
}
}
for(int i=0,j=0;i<bucketNum;i++)//遍歷各個桶
{
Node *p=bucket[i]->next;//獲得桶的入口地址
while(p)
{
array[j++]=p->data;
p=p->next;
}
}
for(int i=0;i<bucketNum;i++)
deleteNode(bucket[i]);
}
int main()
{
int n=10;
int a[N]={2,45,1,56,12,57,25,89,3,23};
cout<<"排序前:";
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
bucketSort(a,n,10);
cout<<endl<<"排序後:";
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
三、分析
元素值域的劃分,也就是元素到桶的對映規則。對映規則需要根據待排序集合的元素分佈特性進行選擇,若規則設計的過於模糊、寬泛,則可能導致待排序集合中所有元素全部對映到一個桶上,則桶排序向比較性質排序演算法演變。若對映規則設計的過於具體、嚴苛,則可能導致待排序集合中每一個元素值對映到一個桶上,則桶排序向計數排序方式演化。排序演算法的選擇,從待排序集合中元素對映到各個桶上的過程,並不存在元素的比較和交換操作,在對各個桶中元素進行排序時,可以自主選擇合適的排序演算法,桶排序演算法的複雜度和穩定性,都根據選擇的排序演算法不同而不同。
相關文章
- 排序演算法之——桶排序排序演算法
- 常用排序演算法之桶排序排序演算法
- 桶排序排序
- 桶排序和基數排序排序
- 【資料結構與演算法】非比較排序(計數排序、桶排序、基數排序)資料結構演算法排序
- 桶排序2排序
- 桶排序 選擇,插入排序排序
- 非交換排序-計數排序和桶排序排序
- 計數排序vs基數排序vs桶排序排序
- 《演算法筆記》5. 字首樹、桶排序、排序演算法總結演算法筆記排序
- 基於桶的排序之計數排序排序
- hive分桶表排序Hive排序
- 手寫演算法並記住它:桶排序演算法排序
- 排序演算法之歸併,快速,堆和桶排序演算法
- 【JS面試向】選擇排序、桶排序、氣泡排序和快速排序簡介JS面試排序
- 基於桶的排序之基數排序以及排序方法總結排序
- 資料結構(python) —— 【18排序: 桶排序】資料結構Python排序
- 排序演算法 - 快速排序排序演算法
- 排序演算法-堆排序排序演算法
- 排序演算法__快速排序排序演算法
- 排序演算法__堆排序排序演算法
- 排序演算法:快速排序排序演算法
- 排序演算法 - 堆排序排序演算法
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- 每天一道演算法題--排序之桶排序實現求排序後相鄰最大差值問題演算法排序
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- rust-algorithms:3-桶排序RustGo排序
- 三分鐘搞懂桶排序排序
- 歸併排序--排序演算法排序演算法
- 排序演算法(歸併排序)排序演算法
- 排序演算法之 '快速排序'排序演算法
- 【排序演算法】- 希爾排序排序演算法
- 排序演算法--氣泡排序排序演算法
- 排序演算法:選擇排序排序演算法
- 排序演算法__氣泡排序排序演算法
- 排序演算法__選擇排序排序演算法
- 排序演算法__歸併排序排序演算法