常用排序算法

以下排序算法默认为从小到大进行排序:

1.快速排序:

      

#include<iostream>
#include<cstdlib>
#include<time.h>
#define M 1000
using namespace std;
void swap(int *a,int *b); 
void quacksort(int a[],int start,int end);
int quack(int a[],int start,int end);

int main(){
	int n;
	int a[M];
	cin >>n;
	srand((unsigned)time(NULL));
	for(int i=0;i<n;i++){
		a[i]=rand()%100;
	}
	for(int i=0;i<n;i++){
		cout <<a[i]<<"  ";//输出排序前的数字
	}
	cout <<endl;
	quacksort(a,0,n-1);
	for(int i=0;i<n;i++){
		cout <<a[i]<<"  ";
	}
	
	return 0;
	
}

void quacksort(int a[],int start,int end){
	
	if(start<end){
		int mid=quack(a,start,end);
		quacksort(a,start,mid-1);
		quacksort(a,mid+1,end);	
	}
	
}

int quack(int a[],int start,int end){
	
	int i,j,k;
	j=start-1;//标记小于a[end]的数 
	for(i=start;i<end;i++){
		if(a[i]<a[end]){
			j++;
			swap(&a[j],&a[i]);
		}
	}
	swap(&a[j+1],&a[end]);
	return j+1;
}

void swap(int *a,int *b){
	
	int c=*a;
	*a=*b;
	*b=c;
}
2.归并排序:

#include<iostream>
#include<time.h>
#include<cstdlib>
#include<cstdio>
#define   M 1000
using namespace std;

void merger(int a[],int start,int end);
void merger_sort(int a[],int start,int temp,int end);

int main(){
    int n;
	int a[M];
	cin >>n;
	srand((unsigned)time(NULL));
	for(int i=0;i<n;i++){
		
		a[i]=rand()%100;
	}
	for(int i=0;i<n;i++){
		
		cout <<a[i]<<"  ";
	}
	cout <<endl;
    merger(a,0,n-1);
	for(int i=0;i<n;i++){
		cout <<a[i]<<"  ";
	}
	
	return 0;
    
    }
    
void merger(int a[],int start,int end){

		int temp;
		if(start<end){
			temp =(start+end)/2;
			merger(a,start,temp);
			merger(a,temp+1,end);
			merger_sort(a,start,temp,end);
		}		
}

void merger_sort(int a[],int start,int mid,int end){

		int i,j,k,n1,n2;
		n1 =mid -start+1;
		n2 =end - mid;
		int b[M],c[M];
		for(i=0;i<n1;i++){
			b[i]=a[start+i];
		}
		
		for(j=0;j<n2;j++){
			c[j]=a[mid+1+j];
		}
		
		k=0,j=0;
		for(i=start;i<=end;i++){
			if(b[k]<c[j]&&k<n1||j>=n2){
				a[i]=b[k];
				k++;
			}else if(b[k]>=c[j]&&j<n2||k>=n1){
				a[i]=c[j];
				j++;
			}
		}
}



3.堆排序:

#include<iostream>
#include<cstdlib>
#include<time.h>
#define MAXSIZE 1000
using namespace  std;

void heapsort(int a[],int length);
void  build_max_heap(int a[] ,int length);
void max_heap(int a[],int i,int length);
void swap(int *a,int *b);
int main(){
	
	int array[MAXSIZE];
    int n,i;
    cin >>n;            //ÊäÈëÊý×鳤¶È
    srand((unsigned)time(NULL));
    for(i = 1;i<=n;i++){                      //ÊäÈëÊý×é
        array[i]=rand()%100;
    } 
     for(i=1;i<=n;i++){
		cout <<array[i]<< "  ";
	}
	cout <<endl;      
    heapsort(array,n);
	for(i=1;i<=n;i++){
		cout <<array[i]<< "  ";
	}
	return 0;
}



void heapsort(int a[],int length){
	
	int i;
	int temp;
	build_max_heap(a,length);	
	for(i=length;i>=1;i--){
		swap(&a[1],&a[i]);
		max_heap(a,1,i-1);
	}
}

void  build_max_heap(int a[] ,int length){
	
	int i;
	for(i=length/2;i>=1;i--){
		max_heap(a,i,length);
	}
}

void max_heap(int a[],int i,int length){
	int max=i;
	int left=2*i;
	int right=2*i+1;
	int temp;
	if(left<=length&&a[left]>a[max])
		max=left;
	if(right<=length&&a[right]>a[max])
		max=right;
		
	if(max!=i){
		swap(&a[i],&a[max]);
		max_heap(a,max,length);
	}
}

void swap(int *a,int *b){
	
	int c=*a;
	*a=*b;
	*b=c;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值