C++实现十大排序

C++、JAVA实现十大排序


1.冒泡排序



2.插入排序

int main() {
	int n;
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>a[i];
	}

//	int n =sizeof(a)/sizeof(int);
//	//插入排序
	for(int i=1; i<n; i++) {
		int key =a[i];
		int j=i-1;
		while(j>=0 && key<a[j]) {
			a[j+1]=a[j];
			j--;
		}
		a[j+1] =key;
	}
	for(int i=0; i<n; i++) {
		cout<<a[i]<<" ";
	}
}

3.选择排序

4.希尔排序

#include<bits/stdc++.h>
using namespace std;
//int a[]= {8,9,1,7,2,3,5,4,6,0};
int a[1001000];
void shellSort(int n) {
	int temp =0;
	for(int gap = n/2; gap>0; gap/=2) {
		for(int i=gap; i<n; i++) {
			for(int j = i-gap; j>=0; j=j-gap) {
				if(a[j]>a[j+gap]) {
					swap(a[j],a[j+gap]);
				}
			}
		}
		for(int i=0; i<n; i++) {
			cout<<a[i]<<" ";
		}
		cout<<endl;
	}
}

//移位法
//希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;
//随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
void shellSort2(int n) {
	int temp=0;
	for(int gap = n/2; gap>0; gap =gap/2) {
		//插入排序
		for(int i=gap; i<n; i++) {
			temp = a[i];
			int j=i-gap;
			if(a[j+gap]<a[j]) {
				while(j>=0 && temp<a[j]) {
					a[j+gap] = a[j];
					j = j-gap;
				}
				a[j+gap] = temp;
			}
		}
	}
}

int main() {
	int n;
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>a[i];
	}
//	int n =sizeof(a)/sizeof(int);
	shellSort4(n);
	for(int i=0; i<n; i++) {
		cout<<a[i]<<" ";
	}
}

5.归并排序

#include<bits/stdc++.h>
using namespace std;
int a[1001000];

int temp[1001000];
//合并
void merge(int left,int mid,int right,int temp[]) {
	int i=left;//左边index
	int j=mid+1; //右边index
	int t=0; //temp index

	//填充temp  直到左右两边一方处理完毕为止
	while(i<=mid && j<=right) {
		//如果左边小于或者等于右边 插入至temp
		if(a[i]<=a[j]) {
			temp[t]=a[i];
			t++;
			i++;
		} else {
			temp[t]=a[j];
			t++;
			j++;
		}

	}
	//将剩余部分的一方填充到temp中
	while(i<=mid) { //左边有剩余
		temp[t]=a[i];
		i++;
		t++;
	}
	while(j<=right) {
		temp[t]=a[j];
		t++;
		j++;
	}
	//将temp拷贝至a
	t=0;
	int tempLeft = left; //第一次合并是 tempLeft=0
	while(tempLeft<=right) {
		a[tempLeft] = temp[t];
		t++;
		tempLeft++;
	}
}

//分
void mergeSort(int left,int right,int temp[]) {

	if(left<right) {
		int mid = (left+right)/2; //中间索引

		//左递归分解
		mergeSort(left,mid,temp);
		mergeSort(mid+1,right,temp);
//		cout<<"第i次"<<left<<mid<< right<<"\t";
//
		merge(left,mid,right,temp);
	}
}

int main() {
	int n;
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>a[i];
	}
//	int len = sizeof(a)/sizeof(int);

	mergeSort(0,n-1,temp);

	for(int i=0; i<n; i++) {
		cout<<a[i]<<" ";
	}
}

/*
8
8 4 5 7 1 3 6 2


*/

6.快速排序

#include<bits/stdc++.h>
using namespace std;

int a[1001000];

void qusort(int l,int r) {
	int i = l;
	int j = r;
	if(i>j) {
		return ;
	}
	int mid = (i+j)/2;
	swap(a[mid],a[i]);
	int point = a[i];
	while(i<j) {
		while(i<j && a[j]>point) {
			j--;
		}
		if(i<j) {
			a[i]=a[j];
			i++;
		}
		while(i<j && a[i]<point) {
			i++;
		}
		if(i<j) {
			a[j]=a[i];
			j--;
		}
	}
	a[i]=point;
	qusort(l,i-1);
	qusort(j+1,r);

}
int main() {
	int n;
	cin>>n;
	for(int i=0; i<n; i++) {
		scanf("%d",&a[i]);
//		cin>>l[i];
	}
	int len = n;
//	cout<<len;
	qusort(0,len-1);
	for(int i=0; i<len; i++) {
		printf("%d ",a[i]);
	}
}

7.堆排序

#include<bits/stdc++.h>
using namespace std;
int a[1001000];
int n;
/**
    堆排序
    @date 2022-04-08
    @author ckack.
*/
void adjustHeap(int i,int length) {
	// 循环进入它的左右节点
	// i*2+1 为该节点的左子树,i*2+2 为该节点的右子树 
	for(int k = i*2+1; k<length; k = k*2+1) {
		//如果k+1大于堆的长度 则说明不存在右子树;如果右子树的值大于左子树 那么k+1 将k指向右子树,
		//并和根节点的值做比较 
		if(k+1< length && a[k]<a[k+1]) {
			k++;
		}
		if(a[k]>a[i]) {
			//如果子树大于根节点 则交换,将k赋值给i,并进入下一层节点。
			// k赋值给i是因为要记录左子树或者右子树节点的值
			//因为下一层循环就会进去 左子树或右子树的下一层。 只有赋值了 才能继续作比较。 
			swap(a[k],a[i]);
			i=k;
		} else {
			break;
		}
	}
}

void heapSort() {
	//循环构建一个大顶推
//	n/2-1 获取最后一个非叶子节点
	for(int i=n/2-1; i>=0; i--) {
		adjustHeap2(i,n);
	}
	//结果 [60 40 23 10 12 14 8 9] 
	
//	for(int i=0; i<n; i++) {
//		cout<<a[i]<<" ";
//	}
//	cout<<endl;

	/**
	* 将构建好的大顶堆 进行循环遍历
	* 由于大顶堆的特性,根节点一定是最大的数,因此将根节点的值和最后一个值交换 同时堆长度 -1	
	*/
	for(int i = n-1; i>0; i--) {
		swap(a[0],a[i]);
		adjustHeap2(0,i);
	}
}

int main() {
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>a[i];
	}
	heapSort();
	for(int i=0; i<n; i++) {
		cout<<a[i]<<" ";
	}
}
/*
8
23 40 60 10 12 14 8 9

*/

8.计数排序

#include<bits/stdc++.h>
using namespace std;
int a[300006];

void countSort(int n) {
	int maxNum =a[0];
	for(int i=1; i<n; i++)  {
		if(maxNum<a[i]) {
			maxNum =a[i];
		}
	}
	int res[maxNum+1];
	int res2[maxNum+1];
	memset(res,0,sizeof(res));
	memset(res2,0,sizeof(res2));
	for(int i=0; i<n; i++) {
		res[a[i]]++;
	}

	for(int i=1; i<maxNum+1; i++) {
		res[i] = res[i]+res[i-1];
	}

	for(int i=0; i<n; i++) {
		res2[res[a[i]]-1]=a[i];
		res[a[i]]--;
	}
	for(int i=0; i<n; i++) {
		a[i]=res2[i];
	}

}
int main() {
	int n;
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>a[i];
	}

//	int n =sizeof(a)/sizeof(int);
	countSort(n);
	for(int i=0; i<n; i++) {
		cout<<a[i]<<" ";
	}
}

9.基数排序

#include<bits/stdc++.h>
using namespace std;
int a[1000006];
//int a[]= {53,3,542,748,14,214};
int n =0;
//int n =sizeof(a)/sizeof(int);

/*
	1. 找到最大值的位数
	2.找个个位中的值,并放入相对应的桶中
*/
//定义二维数组
void radixSort() {
	//寻找最大的数
	int mmax = a[0];
	for(int i=1; i<n; i++) {
		if(mmax<a[i]) {
			mmax =a[i];
		}
	}
	// 最大数的位数
	int mmaxLen=0;
	while(mmax!=0) {
		mmax=mmax/10;
		mmaxLen++;
	}

	//第一轮 针对每个元素的个位进行排序
	//每个桶就是一个一维数组
	//空间换时间的经典算法
	int bucket[10][n+1];
	memset(bucket,0,sizeof(bucket));
	//记录每个桶实际存放了多少个数据
	int bucketElementCounts[10];
	memset(bucketElementCounts,0,sizeof(bucketElementCounts));

//  a[i] / 1 % 10
//  a[i] / 10 % 10

	for(int l = 0,nn=1; l<mmaxLen; l++,nn=nn*10) {
		for(int i=0; i<n; i++) {
			int digitOfElement = a[i] / nn % 10;
			//放入到对应的桶中
			bucket[digitOfElement][bucketElementCounts[digitOfElement]]=a[i];
			bucketElementCounts[digitOfElement]++;
		}
		//取出 放入a中
		int index = 0;
		for(int i=0; i<10; i++) {
			//如果桶中有数据才放入到a中
			if (bucketElementCounts[i]!=0) {
				//s不等于0说明有数据
				for(int j=0; j<bucketElementCounts[i]; j++) {
					//取出元素
					a[index] = bucket[i][j];
					index++;
				}
				bucketElementCounts[i]=0;
			}
		}
		for(int i=0; i<n; i++) {
			cout<<a[i]<<" ";
		}
		cout<<endl;
	}
//	//个位
//	for(int i=0; i<n; i++) {
//		// 去除个位
//		int digitOfElement = a[i] % 10;
//		//放入到对应的桶中
//		bucket[digitOfElement][bucketElementCounts[digitOfElement]]=a[i];
//		bucketElementCounts[digitOfElement]++;
//	}
//	//取出 放入a中
//	int index = 0;
//	for(int i=0; i<n; i++) {
//		//如果桶中有数据才放入到a中
//		if (bucketElementCounts[i]!=0) {
//			//s不等于0说明有数据
//			for(int j=0; j<bucketElementCounts[i]; j++) {
//				//取出元素
//				a[index] = bucket[i][j];
//				index++;
//			}
//			bucketElementCounts[i]=0;
//		}
//	}
}

int main() {
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>a[i];
	}
	radixSort2();
	for(int i=0; i<n; i++) {
		cout<<a[i]<<" ";
	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值