五种数据结构排序算法

T1
//插入排序
#include <stdio.h>

void PrintInsertSort(int A[],int N){

    int i,j,Tmp;

    for(i=1;i<N;i++){

        Tmp=A[i];

        for(j=i;j>0&&A[j-1]>Tmp;j--){

            A[j]=A[j-1];

        }

        A[j]=Tmp;

        for(int q=0;q<N;q++){

            printf("%d,",A[q]);

        }

        printf("\n");

    }

    

    

}

int main(){

    int N;

    scanf("%d",&N);

    int A[N];

    for(int i=0;i<N;i++){

        scanf("%d,",&A[i]);

    }

    PrintInsertSort(A,N);

    return 0;

}
//希尔排序,间隔N,N/2,~~~~~
T2

#include <stdio.h>

void PrintShellSort(int A[],int N){

    int i,j,interval,Tmp;

    for(interval=N/2;interval>0;interval/=2){

        for(i=interval;i<N;i++){

            Tmp=A[i];

            for(j=i;j>=interval&&A[j-interval]<Tmp;j-=interval){

                A[j]=A[j-interval];

            }

            A[j]=Tmp;

        }

        for(int q=0;q<N;q++){

            printf("%d,",A[q]);

        }

        printf("\n");

    }

    

    

}

int main(){

    int N;

    scanf("%d",&N);

    int A[N];

    for(int i=0;i<N;i++){

        scanf("%d,",&A[i]);

    }

    PrintShellSort(A,N);

    return 0;

}


//快速排序,三数中值
T3

#include <stdio.h>

#include <stdlib.h>

void exchange(int *A,int *B){

int a=*A;

*A=*B;

*B=a;

}

int Median3(int A[],int left,int right){

int mid=(left+right)/2;

if(A[left]>A[right])exchange(&A[left],&A[right]);

if(A[left]>A[mid])exchange(&A[left],&A[mid]);

if(A[mid]>A[right])exchange(&A[mid],&A[right]);

exchange(&A[mid],&A[right-1]);

return A[right-1];

}

void InsertSort(int A[],int left,int right){

for(int i=left+1;i<=right;i++){

int H=A[i],n=i;

for(;A[n-1]>H&&n>1;n--){

A[n]=A[n-1];

}

A[n]=H;

}

}

void Print(int A[]){

for(int i=0;i<10;i++)printf("%d,",A[i]);

printf("\n");


}

void QuickSort(int A[],int left,int right){

if(right-left<3) {

InsertSort(A,left,right);

printf("insert(%d,%d):",left,right-left+1);

Print(A);

}

else{

int T=Median3(A,left,right);

int i=0,j=right-1;

while(i<j){

while(A[i]<=T)i++;

while(A[j]>=T)j--;

if(i<j)exchange(&A[i],&A[j]);

}

exchange(&A[j+1],&A[right-1]);

printf("Qsort(%d,%d):",left,right);

Print(A);

QuickSort(A,left,j);

QuickSort(A,j+2,right);


}


}

int main(){

int A[10]={49,38,65,97,76,13,27,50,2,8};

int N;

scanf("%d",&N);

int i=0,j=8;

exchange(&A[N],&A[9]);

while(i<j){

while(A[i]<A[9])i++;

while(A[j]>A[9])j--;

if(i<j)exchange(&A[i],&A[j]);


}

exchange(&A[i],&A[9]);

printf("Qsort(0,9):");

Print(A);

QuickSort(A,0,i-1);

QuickSort(A,i+1,9);


}



//选择排序

T4

#include <stdio.h>

#include <stdlib.h>

void Swap(int *A,int*B){

    int a=*A;

    *A=*B;

    *B=a;

}

void SeleteSort(int A[],int N){

    for(int i=0;i<N-1;i++){

        int M=i;

        for(int n=i;n<N;n++){

            if(A[n]<A[M])M=n;

            

        }

        Swap(&A[M],&A[i]);

        for(int n=0;n<N;n++){

            printf("%d,",A[n]);

        }

        printf("\n");

    }

    

}

int main(){

    int N;

    scanf("%d",&N);

    int A[N];

    for(int i=0;i<N;i++){

        scanf("%d,",&A[i]);

    }

    SeleteSort(A,N);

    return 0;

}

//基排序
T5

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

typedef struct stack{

int size;

int A[20];

}* STACK;

int f(int n,int m);

void OUTPUT(STACK* A,int N[]);

int main(){

STACK *A=(STACK*)malloc(sizeof(STACK)*10);


for(int i=0 ;i<10;i++){

A[i]=(STACK)malloc(sizeof(struct stack));

A[i]->size=0;

}

char input[100];

scanf("%s",input);

int N[100],num=0,n=0,t=0;

while(input[n]!='\n'&&input[n]!='\0'){

if(input[n]==','){

N[num++]=t;

t=0;

}

else{

t=t*10+(int)(input[n]-'0'); 

}

n++;

}

int M;

scanf("%d",&M);


for(int m=0;m<num;m++){

A[f(N[m],0)]->A[A[f(N[m],0)]->size++]=N[m];

}

OUTPUT(A,N);



for(int i=1;i<M;i++){

for(int m=0;m<num;m++){

A[f(N[m],i)]->A[A[f(N[m],i)]->size++]=N[m];

}

OUTPUT(A,N);

}

for(int i=0;i<num;i++){

printf("%d,",N[i]);

}

}



int f(int n,int m){

for(int i=0;i<m;i++){

n/=10;

}

return n%10;

}



void OUTPUT(STACK* A,int N[]){

int n=0;

for(int i=0;i<10;i++){

for(int m=0;m<A[i]->size;m++){

N[n++]=A[i]->A[m];

} 

A[i]->size=0;

} 


}

//归并排序
#include <stdio.h>
#include <stdlib.h>
void Merge(int A[],int size,int Ls,int Le,int Re){
	int *B=(int *)malloc(sizeof(int)*size);
	int Rs=Le+1,n=Ls,Q=Ls;
	while(Ls<=Le&&Rs<=Re){
		if(A[Ls]<A[Rs]){
			B[n++]=A[Ls++];
		}
		else{
			B[n++]=A[Rs++];
		}
	}
	while(Ls!=Le+1){
		B[n++]=A[Ls++];
	}
	while(Rs!=Re+1){
		B[n++]=B[Re++];
	}
	for(int i=Re;i>=Q;i--){
		A[i]=B[i];
	}
}
void Mergesort(int A[],int size,int left,int right){
	if(left<right){
		int middle=(right+left)/2;
		Mergesort(A,size,left,middle);
		Mergesort(A,size,middle+1,right);
		Merge(A,size,left,middle,right);
	}
}
int main(){
int A[10]={9,8,7,6,5,4,3,2,1,0};
Mergesort(A,10,0,9);
for(int i=0;i<10;i++){
	printf("%d ",A[i]);
}
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值