小孱弱弱來補上前天的大坑,尤其要注意的是桶排序,這裏只介紹簡單版本,後面分享算法導論時,再深入寫寫。
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <time.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <list>
using namespace std;
#define MAXN_QSORT 7
#define MAXN 10
vector<int>vecRaw(10,0);
vector<int>vecObj(10,0);
int pa[10];
//六、歸併排序 平均時間複雜度O(n*logn) 最壞時間複雜度O(n*logn)
//空間複雜度 O(1) 穩定
//遞歸實現
void Merge(int SR[],int TR[],int i,int m,int n)
{
int j,k,l;
for(j=m+1,k=i;i<=m&&j<=n;k++)
{
if(SR[i]<SR[j])
TR[k]=SR[i++];
else
TR[k]=SR[j++];
}
if(i<=m)
{
for(l=0;l<=m-i;l++)
TR[k+l]=SR[i+l];
}
if(j<=n)
{
for(l=0;l<=n-j;l++)
TR[k+l]=SR[j+l];
}
}
void MSort(int SR[],int TR1[],int s,int t)
{
int m;
int TR2[MAXN+1];
if(s==t)
TR1[s]=SR[s];
else
{
m=(s+t)/2;
MSort(SR,TR2,s,m);
MSort(SR,TR2,m+1,t);
Merge(TR2,TR1,s,m,t);
}
}
void MergeSort(SqList *L)
{
MSort(L->r,L->r,1,L->length);
}
//迭代實現
void MergePass(int SR[],int TR[],int s,int n)
{
int i=1,j;
while(i<=n-2*s+1)//排除奇數的最後一位
{
Merge(SR,TR,i,i+s-1,i+2*s-1);
i=i+s*2;
}
if(i<n-s+1)
Merge(SR,TR,i,i+s-1,n);
else
for(j=i;j<=n;j++)
TR[j]=SR[j];
}
void MergeSort2(SqList *L)
{
int *TR=(int*)malloc(L->length*sizeof(int));
int k=1;
while(k<L->length)
{
MergePass(L->r,TR,k,L->length);
k=2*k;
MergePass(TR,L->r,k,L->length);
k=2*k;
}
}
//七、快速排序 平均時間複雜度O(n*logn) 最壞時間複雜度O(n*n)
//空間複雜度 O(logn) 不穩定
//三數去中法
int Partition (SqList *L,int low,int high)
{
//int pivotkey=L->r[low];
int pivotkey;
int m=low+(high-low)/2;
if(L->r[low]>L->r[high])
swap(L,low,high);
if(L->r[m]>L->r[high])
swap(L,high,m);
if(L->r[m]>L->r[low])
swap(L,m,low);
pivotkey=L->r[low];
L->r[0]=pivotkey;//優化
while(low<high)
{
while(low<high&&L->r[high]>=pivotkey)
high--;
L->r[low]=L->r[high];//優化
swap(L,low,high);
while(low<high&&L->r[low]<=pivotkey)
low++;
L->r[high]=L->r[low];//優化
swap(L,low,high);
}
L->r[low]=L->r[0];//優化
return low;
}
void QSort(SqList *L,int low ,int high)
{
int pivot;
if((high-low)>MAXN_QSORT)
{
while(low<high)//優化
{
pivot=Partition(L,low,high);
QSort(L,low,pivot-1);
low=pivot+1;
}
// pivot=Partition(L,low,high);
//
// QSort(L,low,pivot-1);
// QSort(L,pivot+1,high);
}
else
InsertSort(L);//小於長度閥,調用插入排序
}
void QuickSort(SqList *L)
{
QSort(L,1,L->length);
}
//八、計數排序 平均時間複雜度O(n+m) 最壞時間複雜度O(n+m)
//空間複雜度 O(n+m) 穩定
void CountSort(vector<int>&vecRaw,vector <int>&vecObj)
{
//待排容器爲空
if(vecRaw.size()==0)
return;
//計數向量置空
int length=(*max_element(vecRaw.begin(),vecRaw.end()))+1;
//max_element返回迭代器,用來求數組最大值
vector<int> vecCount(length,0);
//統計每個鍵值出現的次數
for(int i=0;i<vecRaw.size();i++)
vecCount[vecRaw[i]]++;
//後面鍵值出現的位置爲前面所有鍵值出現的和
for(int i=1;i<length;i++)
vecCount[i]+=vecCount[i-1];
//將鍵值放到目標位置
for(int i=vecRaw.size();i>0;i--)
vecObj[--vecCount[vecRaw[i-1]]]=vecRaw[i-1];
}
//九、桶排序 平均時間複雜度O(n) 最壞時間複雜度O(n)
//空間複雜度 O(m) 穩定
//簡單版本
void bucketSort(int a[], int n)
{
int j=0,b[101];
for(int i=0;i<101;i++)
b[i]=0;
for(int i=0;i<n;i++)
{
b[a[i]]++;
}
for(int i=0;i<=100;i++)
{
if(b[i]!=0)
a[j++]=i;
}
}
//十、計數排序 平均時間複雜度O(n) 最壞時間複雜度O(n)
//空間複雜度 O(m) 穩定
int maxbit(int data[],int n)//輔助函數
{
int maxdata=data[0];
for(int i=1;i<n;i++)//最大數
if(maxdata<data[i])
maxdata=data[i];
//位數
int d=1,p=10;
while(maxdata>=p)
{
//p*=10;
maxdata/=10;
++d;
}
return d;
}
void radixSort(int data[],int n)
{
int d=maxbit(data,n);
int *temp=new int[n];
int *count=new int[n];//計數器
int i,j,k;
int radix=1;
for(i=1;i<=d;i++)
{
for(j=0;j<10;j++)
count[j]=0;//計數器置空
for(j=0;j<n;j++)
{
k=(data[j]/radix)%10;
count[k]++;
}
for(j=1;j<=10;j++)
count[j]=count[j-1]+count[j];
for(j=n-1;j>=0;j--)
{
k=(data[j]/radix)%10;
temp[count[k]-1]=data[j];
count[k]--;
}
for(j=0;j<n;j++)
data[j]=temp[j];
radix=radix*10;
}
delete []temp;
delete []count;
}
int main ()
{
srand(time(NULL));
// for(int i=0;i<vecRaw.size();i++)
// vecRaw[i]=rand()%100+1;
// CountSort(vecRaw,vecObj);
// for(int i=0;i<vecObj.size();i++)
// cout<<vecObj[i]<<' ';
for(int i=0;i<10;i++)
pa[i]=rand()%100+1;
bucketSort(pa,10);
for(int i=0;i<10;i++)
cout<<pa[i]<<' ';
// for(int i=0;i<10;i++)
// pa[i]=rand()%100+1;
// radixSort(pa,10);
// for(int i=0;i<10;i++)
// cout<<pa[i]<<' ';
return 0;
}