幾種排序演算法實現分析
阿新 • • 發佈:2019-02-13
合併排序
void merge(int a[],int left,int mid,int right,int b[]) { int i = left; int j = mid +1; int k = left; while(i<=mid&&j<=right) { if(a[i]<a[j]) b[k++]=a[i++]; else b[k++]=a[j++]; } if(i>mid) { while(j<=right) b[k++]=a[j++]; } else { while(i<=mid) b[k++]=a[i++]; } } void copy(int a[],int b[],int left,int right) { for(int i=left;i<=right;i++) a[i]=b[i]; } void mergeSort(int a[],int left,int right,int len) { if(left<right) { int mid = (left+right)/2; mergeSort(a,left,mid,len); mergeSort(a,mid+1,right,len); int * b = new int[len]; //將排序後的結果存入b merge(a,left,mid,right,b); copy(a,b,left,right); //將b中的結果轉到a; delete[] b; } }
快速排序
插入排序void swap(int &a,int &b) { int buf = a; a = b; b = buf; } int partion(int a[],int low,int high) { int i = low; int j = high+1; int x = a[low]; while(true) { while(i<high&&a[++i]<x); while(j>low&&a[--j]>x); if(i>=j) break; swap(a[i],a[j]); } swap(a[j],a[low]); return j; } void quickSort(int a[],int low,int high) { if(low<high) { int q = partion(a,low,high); quickSort(a,low,q-1); quickSort(a,q+1,high); } }
希爾排序void swap(int &a,int &b) { int buf = a; a = b; b = buf; } void insertSort(int a[],int len) { for(int i = 1;i<len;i++) { for(int j = i;j>0;j--) { if(a[j]<a[j-1]) swap(a[j],a[j-1]); else break; } } }
#include <math.h>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
void swap(int &a,int &b)
{
int buf = a;
a = b;
b = buf;
}
int mi(int cnt)
{
int s =1;
for(int i=1;i<=cnt;i++)
{
s*=2;
}
return s;
}
void hillInsert(int a[],int d,int len)
{
for(int i =d;i<len;i++)
{
for(int j=i;j>0;j=j-d)
{
if(a[j]<a[j-d])
{
swap(a[j],a[j-d]);
}
else
break;
}
}
}
/*
*d是增量序列
*hillCnt是增量序列的長度
*/
void hillSort(int a[],int d[],int hillCnt,int len)
{
for(int i=0;i<hillCnt;i++)
{
hillInsert(a,d[i],len);
}
}
void main()
{
int a[] = {76,22,33,12,67,45};
int len = sizeof(a)/sizeof(int);
int hillCnt =log(len+1.0)/log(2.0);
int *d = new int[hillCnt];
for(int i=0;i<hillCnt;i++)
{
d[i] = mi(hillCnt-i)-1;
}
hillSort(a,d,hillCnt,len);
for(int i=0;i<len;i++)
{
cout<<a[i]<<endl;
}
}
氣泡排序
void swap(int &a,int &b)
{
int buf = a;
a = b;
b = buf;
}
void bubbleSort(int a[],int len)
{
for(int i=1;i<len;i++)
{
for(int j=0;j<len-i;j++)
{
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
}
}
堆排序
#include "Queue.h"
#include "QueueItem.h"
#include <math.h>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
void swap(int &a,int &b)
{
int x = a;
a = b;
b = x;
}
void heapAdjust(int a[],int len,int s)
{
for(int i=2*s+1;i<len;i=2*i+1)
{
if(i+1<len&&a[i]>a[i+1])i++;
if(a[i]>a[s])
break;
swap(a[s],a[i]);
s = i;
}
}
void heapSort(int a[],int len)
{
for(int i=len/2-1;i>=0;i--)
{
heapAdjust(a,len,i);
}
for(int i=0;i<len;i++)
{
cout<<a[i]<<endl;
}
for(int i=len;i>=1;i--)
{
cout<<a[0]<<" "<<a[i-1]<<endl;
swap(a[i-1],a[0]);
heapAdjust(a,i-1,0);
}
}
void main()
{
int a[] = {76,22,33,12,67,45,24};
int len = sizeof(a)/sizeof(int);
heapSort(a,len);
for(int i=0;i<len;i++)
{
cout<<a[i]<<endl;
}
}
基數排序
#include "stdafx.h"
#include "Queue.h"
#include "QueueItem.h"
#include <math.h>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
#define MAX_NUM_OF_KEY 8
#define RADIX 10
#define MAX_SPACE 10000
struct SLCell
{
int value[MAX_NUM_OF_KEY];
int next;
};
struct SLList
{
SLCell r[MAX_SPACE];
int keynum;//一個數包含的位數,最大為8為
int recnum;//排序數的個數,最大為10000
};
//將每位相同的組合在一起形成單獨的連結串列
void distribute(SLList &r,int index,int f[],int e[])
{
int len = r.recnum;
for(int i=0;i<RADIX;i++)
f[i]=0;//對f進行初始化
for(int p=r.r[0].next;p;p=r.r[p].next)
{
int j = r.r[p].value[index];
if(!f[j])
f[j]=p;
else
r.r[e[j]].next = p;
e[j]=p;
}
}
//將連結串列整合在一起
void collect(SLList &r,int index,int f[],int e[])//f中存的每一個佇列的首,e是每一個尾
{
int j;
for(j=0;!f[j];j++);
r.r[0].next=f[j];
int t = e[j];
while(j<RADIX)
{
for(j=j+1;j<RADIX-1&&!f[j];j=j+1);
if(j<RADIX&&f[j])
{
r.r[t].next=f[j];
t=e[j];
}
}
r.r[t].next = 0;
}
void radixSort(SLList &r,int f[],int e[])
{
for(int i=0;i<r.keynum;++i)
{
distribute(r,i,f,e);
collect(r,i,f,e);
}
}
void main()
{
SLList list;
list.r[0].next = 1;
list.r[1].value[0]=3;
list.r[1].value[1]=0;
list.r[1].value[2]=2;
list.r[1].next = 2;
list.r[2].value[0]=3;
list.r[2].value[1]=3;
list.r[2].value[2]=9;
list.r[2].next = 3;
list.r[3].value[0]=8;
list.r[3].value[1]=8;
list.r[3].value[2]=0;
list.r[3].next = 4;
list.r[4].value[0]=4;
list.r[4].value[1]=1;
list.r[4].value[2]=7;
list.r[4].next = 0;
list.keynum = 3;
list.recnum = 5;
int *f = new int[RADIX];
int *e = new int[RADIX];
for(int p=list.r[0].next;p;p=list.r[p].next)
{
for(int i =list.keynum-1;i>=0;i--)
{
cout<<list.r[p].value[i];
}
cout<<endl;
}
cout<<"------------------"<<endl;
radixSort(list,f,e);
for(int p=list.r[0].next;p;p=list.r[p].next)
{
for(int i =list.keynum-1;i>=0;i--)
{
cout<<list.r[p].value[i];
}
cout<<endl;
}
cout<<"------------------"<<endl;
delete[] f;
delete[] e;
}
轉自:http://www.cnblogs.com/zhuxiongfeng/archive/2010/03/23/1692903.html