排序演算法__桶排序

Enjoy_process發表於2019-03-08

                                              排序演算法__桶排序

 

 

一、介紹

桶排序是將待排序集合中處於同一個值域的元素存入同一個桶中,也就是根據元素值特性將集合拆分為多個區域,則拆分後形成的多個桶,從值域上看是處於有序狀態的。對每個桶中元素進行排序,則所有桶中元素構成的集合是已排序的。桶排序更是對計數排序的改進,計數排序申請的額外空間跨度從最小元素值到最大元素值,若待排序集合中元素不是依次遞增的,則必然有空間浪費情況。桶排序則是弱化了這種浪費情況,將最小值到最大值之間的每一個位置申請空間,更新為最小值到最大值之間每一個固定區域申請空間,儘量減少了元素值大小不連續情況下的空間浪費情況。

 

二、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;
}

三、分析

元素值域的劃分,也就是元素到桶的對映規則。對映規則需要根據待排序集合的元素分佈特性進行選擇,若規則設計的過於模糊、寬泛,則可能導致待排序集合中所有元素全部對映到一個桶上,則桶排序向比較性質排序演算法演變。若對映規則設計的過於具體、嚴苛,則可能導致待排序集合中每一個元素值對映到一個桶上,則桶排序向計數排序方式演化。排序演算法的選擇,從待排序集合中元素對映到各個桶上的過程,並不存在元素的比較和交換操作,在對各個桶中元素進行排序時,可以自主選擇合適的排序演算法,桶排序演算法的複雜度和穩定性,都根據選擇的排序演算法不同而不同。

 

相關文章