排序(冒泡、选择、插入、希尔、快排、归并)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define random(x) (rand()%100)
int a[15],n;
void BubbleSort(){
	int cmp=0,exc=0;
	for(int i=0;i<n;i++){
		int x=0;
		for(int j=0;j<n-1-i;j++){
			cmp++;
			if(a[j]>a[j+1]){
				exc++;
				x++;
				swap(a[j],a[j+1]);
			}
		}
		if(x==0) break;
	}
	printf("-----BubbleSort-----\n");
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("比较:%d 交换:%d\n",cmp,exc);
}

void SelectionSort(){
	int cmp=0,exc=0;
	int index;
	for(int i=0;i<n-1;i++){
		index=i;
		for(int j=i+1;j<n;j++){
			cmp++;
			if(a[j]<a[index]){
				index=j;
			}
		}
		if(index!=i) {
			swap(a[i],a[index]);
			exc++;
		}
	}
	printf("-----SelectionSort-----\n");
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("比较:%d 交换:%d\n",cmp,exc);
}

void InsertSort(){
	int cmp=0,exc=0;
	int i,j,tmp;
	for(i=1;i<n;i++){
		cmp++;
		if(a[i]<a[i-1]){
			tmp=a[i];
			for(j=i-1;j>=0&&tmp<a[j];j--){
				cmp++;
				a[j+1]=a[j];
				exc++;
			}
			a[j+1]=tmp;
		}
	}
	printf("-----InsertSort-----\n");
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("比较:%d 交换:%d\n",cmp,exc);
}

void ShellSort(){
	int cmp=0,exc=0;
	for(int len=n/2;len>0;len/=2){
		for(int i=len;i<n;i++){
			int tmp=a[i],j;
			for(j=i-len;j>=0&&tmp<a[j];j-=len){
				cmp++;
				a[j+len]=a[j];
				exc++;
			}
			cmp++;
			a[j+len]=tmp;
		}
	}
	printf("-----ShellSort-----\n");
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("比较:%d 交换:%d\n",cmp,exc);
}

int QuickPos(int l,int r,int &cmp,int &exc){
	int tmp=a[r];
	int i=l;
	for(int j=l;j<r;j++){
		cmp++;
		if(a[j]<tmp){
			swap(a[i],a[j]);
			exc++;
			i++;
		}
	}
	swap(a[i],a[r]);
	return i;
}
void QuickSort(int l,int r,int &cmp,int &exc){
	if(l<r){
		int tmp=QuickPos(l,r,cmp,exc);
		QuickSort(l,tmp-1,cmp,exc);
		QuickSort(tmp+1,r,cmp,exc);
	}
}
void QuickSortP(int l,int r){
	int cmp=0,exc=0;
	QuickSort(l,r,cmp,exc);
	printf("-----QuickSort-----\n");
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("比较:%d 交换:%d\n",cmp,exc);
}

void MergeSort(int l,int r,int &cmp,int &exc){
	if(l>=r) return;
	int len=r-l+1;
	int mid=(l+r)/2;
	int st1=l,end1=mid,st2=mid+1,end2=r;
	MergeSort(st1,end1,cmp,exc);
	MergeSort(st2,end2,cmp,exc);
	int i=0;
	int *tmp=(int *)malloc(len*sizeof(int));
	while(st1<=end1&&st2<=end2){
		cmp++;
		exc++;
		tmp[i++]=a[st1]<a[st2]?a[st1++]:a[st2++];
	}
	while(st1<=end1) tmp[i++]=a[st1++];
	while(st2<=end2) tmp[i++]=a[st2++];
	for(int k=l,i=0;k<=r;k++,i++){
		a[k]=tmp[i];
	}
	free(tmp);
}
void MergeSortP(int l,int r){
	int cmp=0,exc=0;
	MergeSort(l,r,cmp,exc);
	printf("-----MergeSort-----\n");
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("比较:%d 交换:%d\n",cmp,exc);
}

void init1(){
	for(int i=0;i<n;i++){
		a[i]=i+5;
	}
}
void init2(){
	for(int i=0;i<n;i++){
		a[i]=25-i;
	}
}
void init3(){
	for(int i=0;i<n;i++){
		a[i]=random(100);
	}
}
int main()
{
	printf("请输入个数:");
	cin>>n; 
	printf("\n-----正序-----\n\n");
	init1();
	BubbleSort();
	init1();
	SelectionSort();
	init1();
	InsertSort();
	init1();
	ShellSort();
	init1();
	QuickSortP(0,n-1);
	init1();
	MergeSortP(0,n-1);
	printf("\n-----逆序-----\n\n");
	init2();
	BubbleSort();
	init2();
	SelectionSort();
	init2();
	InsertSort();
	init2();
	ShellSort();
	init2();
	QuickSortP(0,n-1);
	init2();
	MergeSortP(0,n-1);
	printf("\n-----随机-----\n\n");
	init3();
	BubbleSort();
	init3();
	SelectionSort();
	init3();
	InsertSort();
	init3();
	ShellSort();
	init3();
	QuickSortP(0,n-1);
	init3();
	MergeSortP(0,n-1);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值