#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define RADIX 10 //基数排序的基
#define M 9//数组大小
//插入排序
void Insertsort(int a[],int n){
for(int i=1;i<n;i++){
int temp = a[i];
int j=i;
for(;j>0&&a[j-1]>temp;j--){
a[j]=a[j-1];
}
a[j] = temp;
}
}
//归并排序
void Merge(int a[],int begin,int middle,int end){
int b[end-begin+1];
int left = begin;
int right = middle+1;
int j = 0;
while(left<=middle&&right<=end){
if(a[left]<a[right]){
b[j] = a[left];
left++;
j++;
}
else{
b[j] = a[right];
right++;
j++;
}
}
while(left<=middle){
b[j] = a[left];
left++;
j++;
}
while(right<=end){
b[j] = a[right];
right++;
j++;
}
j=-1;
for(int i=begin;i<=end;i++){
a[i]=b[++j];
}
}
void Mergesort(int a[],int begin,int end){
if(begin<end){
int middle = (begin+end)/2;
Mergesort(a,begin,middle);
Mergesort(a,middle+1,end);
Merge(a,begin,middle,end);
}
}
//快排
int partition(int a[],int begin,int end){
int key = a[end];
int i = begin-1;
for(int j=begin;j<end;j++){
if(a[j]<=key){
i++;
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
i++;
a[end] = a[i];
a[i] = key;
return i;
}
void quiksort(int a[],int begin,int end){
if(begin<end){
int middle = partition(a,begin,end);
quiksort(a,begin,middle-1);
quiksort(a,middle+1,end);
}
}
//随机快排
void randomQuiksort(int a[],int begin,int end){
if(begin<end){
srand((unsigned)time(NULL));
int num = (rand() % (end - begin)) + begin;
int temp = a[num];
a[num] = a[end];
a[end] = temp;
int middle = partition(a,begin,end);
quiksort(a,begin,middle-1);
quiksort(a,middle+1,end);
}
}
//计数排序
int max(int a[],int n){
int num = a[0];
for(int i=1;i<n;i++){
if(a[i]>num) num = a[i];
}
return num;
}
int countingsort(int a[],int n){
int num = max(a,n);
int b[num+1];
int c[n];
for(int i=0;i<num+1;i++){
b[i] = 0;
}
for(int i =0;i<n;i++){
b[a[i]] = b[a[i]]+1;
}
for(int i=1;i<num+1;i++){
b[i] = b[i-1]+b[i];
}
for(int i=n-1;i>=0;i--){
c[b[a[i]]-1] = a[i];
b[a[i]]--;
}
for(int i=0;i<9;i++){
a[i] = c[i];
}
}
//基数排序
int findMaxRadix(int a[]){
int max = 0;
int maxRadix = 0;
for(int i = 0;i<M;i++){
if(max<a[i]){
max = a[i];
}
}
while (max !=0){
max = max/RADIX;
maxRadix ++;
}
return maxRadix;
}
void RadixSort(int a[],int maxRadix){
int bucket [RADIX][M] = {};
for(int i =0;i<=maxRadix;i++){
int radix = (int)pow(RADIX,i);//对哪一位进行排序
for(int j=0;j<M;j++){
int temp = (a[j]/radix)%RADIX; //数组中一个数在排序位的值
for(int k=0;k<M;k++){
if(bucket[temp][k]==0)
{
bucket[temp][k]=a[j];
break;
}
}
}
int count = 0;
for(int j = 0;j<RADIX;j++){
for(int k=0;k<M;k++){
if(bucket[j][k]!=0){
a[count] = bucket[j][k];
count++;
bucket[j][k]=0;
}
}
}
}
}
int main(void){
int a[] = {6,5,19,3,1,17,22,4,8};
//Insertsort(a,9);
//Mergesort(a,0,8);
//quiksort(a,0,8);
//randomQuiksort(a,0,8);
//countingsort(a,9);
RadixSort(a,findMaxRadix(a));
for(int i=0;i<9;i++){
printf("%d ",a[i]);
}
}
算法上机(一)几种常用的排序算法
最新推荐文章于 2021-12-24 20:15:59 发布