代码主要是将《算法导论》书中的伪代码实现了一遍,其中基数排序只能排2位数,3位数以上会出错,没找到原因,麻烦大佬能帮忙指出一下。桶排序没完成,有空再试一下。
#include <iostream>
#include <math.h>
#include <vector>
#define INF 0x3f3f3f3f
#define INX 0xc0c0c0c0
using namespace std;
void print(int a[],int n){
for(int j= 0; j<n; j++){
cout<<a[j] <<" ";
}
cout<<endl;
}
void insertSort(int a[],int n){
int i=0,j=0;
int tmp=0;
for( i=1;i<n;i++){
tmp=a[i];
j=i-1;
while(j>=0 && a[j]>tmp){
a[j+1]=a[j];
j--;
}
a[j+1]=tmp;
}
cout<<"insertSort:"<<"";
print(a,n);
}
void selectSort(int a[],int n){
int i=0,j=0,k=0;
int tmp=0;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(a[k]>a[j]) k=j;
}
tmp=a[i];
a[i]=a[k];
a[k]=tmp;
}
cout<<"selectSort:"<<"";
print(a,n);
}
void mergeBoth(int a[],int p,int q,int r){
int n1=q-p+1;
int n2=r-q;
int L[n1+1]={};
int R[n2+1]={};
int i=0,j=0,k=0;
for(i=0;i<n1;i++){
L[i]=a[p+i];
}
for(j=0;j<n2;j++){
R[j]=a[p+n1+j];
}
L[n1]=INF;
R[n2]=INF;
i=j=0;
for(k=p;k<=r;k++){
if(L[i]<=R[j]){
a[k]=L[i];
i++;
}else{
a[k]=R[j];
j++;
}
}
}
void mergeSort(int a[],int p,int r){
int q=0;
if (p<r){
q=(p+r)/2;
mergeSort(a,p,q);
mergeSort(a,q+1,r);
mergeBoth(a,p,q,r);
}
}
int countingSort(int a[],int n){
int i,j;
int b[n]={};
int max=INX;
for (i=0;i<n;i++){
if(a[i]>max){
max=a[i];
}
}
int c[max+1]={};
for(i=0;i<max+1;i++){
c[i]=0;
}
for(j=0;j<n;j++){
c[a[j]]=c[a[j]]+1;
}
for(i=0;i<max+1;i++){
c[i+1]=c[i]+c[i+1];
}
for(j=n-1;j>=0;j--){
b[c[a[j]]-1]=a[j];
c[a[j]]=c[a[j]]-1;
}
cout<<"coutingSort:"<<"";
print(b,n);
}
int getDigitalNumInPos(int data, int pos)
{
for(int i = 0; i < pos-1; i++){
data = data/10;
}
int ret = data%10;
//cout<<ret<<"";
return ret;
}
void radixSort(int a[],int d,int n){
int c[10]={};
int b[n]={};
for(int i=1;i<=d;i++){
//countingSort
for (int j=0;j<10;j++){
c[j]=0;//clear the bucket
}
for (int k=0;k<n;k++){
c[getDigitalNumInPos(a[k],i)]+=1;
}
for(int j=0;j<10;j++){
c[j+1]=c[j]+c[j+1];
}
for(int k=n-1;k>=0;k--){
b[c[getDigitalNumInPos(a[k],i)]-1]=a[k];
c[getDigitalNumInPos(a[k],i)]-=1;
}
for(int k=0;k<n;k++){
a[k]=b[k];
}
}
cout<<"radixSort:"<<"";
print(a,n);
}
void bucketSort(int a[],int n){
//find minx max value of the array data
int min = INX;
int max = INF;
for(int i = 0; i < n; i++)
{
if(a[i] < min)
min = a[i];
if(a[i] > max)
max = a[i];
}
//get the bucket counts;
int bucketCounts = (max-min)/n + 1;
vector<vector<int>> bucketArrays;
for(int i = 0; i < bucketCounts; i++)
{
//position 0 used to keep the data count store in this bucket
vector<int> bucket;
bucketArrays.push_back(bucket);
}
//assign each value to bucket arrays.
for(int j = 0; j < n; j++)
{
int num = (a[j]-min)/n;
bucketArrays[num].push_back(a[j]);
}
//sort each bucket
for(int i = 0; i < bucketCounts; i++)
{
//std::sort(bucketArrays[i].begin(), bucketArrays[i].end());
//insertSort(bucketArrays[i],n);
}
int index = 0;
//collect value from radix arrays to data
for(int k = 0; k < bucketCounts; k++)
{
for(int s = 0; s < bucketArrays[k].size(); s++)
{
a[index++] = bucketArrays[k][s];
}
}
cout<<"bucketSort:"<<"";
print(a,n);
}
void exchange(int a,int b){
int tmp=a;
a=b;
b=tmp;
}
int partiton(int a[],int p,int r){
int key=a[r];
int i=p-1;
for(int j=p;j<r-1;j++){
if(a[j]<=key){
i+=1;
exchange(a[i+1],a[j]);
}
}
exchange(a[i+1],a[r]);
return i+1;
}
void quickSort(int a[],int p, int r){
if(p<r){
int q=partiton(a,p,r);
quickSort(a,p,q-1);//q is sorted
quickSort(a,q+1,r);
}
}
void maxHeapiey(int a[],int i,int n){
int l=2*i-1;
int r=2*i;
int largest;
if ( l<=n && a[l]>a[i]){
largest=l;
}else{
largest=i;
}
if ( r<=n && a[r]>a[largest]){
largest=r;
}
if(largest!=i){
exchange(a[largest],a[i]);
maxHeapiey(a,largest,n);
}
}
void buildMaxHeap(int a[],int n){
for(int i=n/2;i>=0;i--){
maxHeapiey(a,i,n);
}
}
void heapSort(int a[],int n){
buildMaxHeap(a,n);
for(int i=n;i>0;i--){
exchange(a[0],a[i]);
n--;
maxHeapiey(a,0,n);
}
cout<<"heapSort:"<<"";
print(a,8);
}
int main(){
int a[8] = {3,1,5,7,2,4,9,6};
int t[8]={2,5,3,0,2,3,0,3};
int d[5]={22,19,63,77,89};
int c[7]={329,457,657,839,436,720,355};
int f[7]={3290,4517,6257,8339,4436,5720,6355};
insertSort(a,8);
selectSort(a,8);
mergeSort(a,0,7);
cout<<"mergeSort:"<<"";
print(a,8);
countingSort(a,8);
//radixSort(f,4,7);
radixSort(d,2,5);
quickSort(a,0,7);
cout<<"quickSort:"<<"";
print(a,8);
heapSort(a,8);
//bucketSort(a,8);
//print(a);
}