十大经典排序(冒泡,选择,插入,归并,快速,堆,桶,希尔,计数,基数)

本文介绍了十大经典排序算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序(桶思想)。分别提供了C语言和C++的实现代码,是理解排序算法和编程实践的宝贵资源。
摘要由CSDN通过智能技术生成

十大排序算法
十大排序算法

冒泡排序

C语言
#include<stdio.h>
#include<stdlib.h>
void exchange(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}
void bubbleSort(int* arr, int n) {
	for (int i = 1; i < n; i++) {
		int flag = 0;       //其作用是为了检验某次遍历后是否完成排序,完成排序flag依旧0,未完成则为1
		for (int j = 0; j < n - i; j++) {
			if (arr[j] > arr[j + 1]) {
				exchange(&arr[j], &arr[j + 1]);
				flag = 1;
				/*int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;*/
			}
		}
		if (flag == 0) {   //完成排序直接结束循环
			return;
		}
	}
}

int main() {
	int arr[] = { 4,2,6,5,8,9 };
	int n = sizeof(arr) / sizeof(int);
	bubbleSort(arr, n);//函数调用
	for (int i = 0; i < n;i++) {
		printf("%d",arr[i]);
	}
	return 0;
}
C++
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//void swap(int* a, int* b) {
//	int temp = *a;
//	*a = *b;
//	*b = temp;
//}
void bubbleSort(vector<int>& vec, int n) {
	for (int i = 1; i < n; i++) {
		int flag = 0; //其作用是为了检验某次遍历后是否完成排序,完成排序flag依旧0,未完成则为1
		for (int j = 0; j < n - i; j++) {//因为j<n-i不会出现下面数组越界的情况
			if (vec[j] > vec[j + 1]) {
				swap(vec[j], vec[j + 1]);
				flag = 1;
			}
		}
		if (flag == 0) return;

	}
}
int main() {
	vector<int>vec = { 6,3,9,8,5,3 };
	int n = vec.size();
	bubbleSort(vec, n);
	for (int i = 0; i < n; i++) {
		cout<<vec[i]<<" ";
	}
	return 0;//完成排序直接结束循环
}

选择排序

C语言
#include<stdio.h>
#include<stdlib.h>
void swap(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}
void SelectSort(int* arr, int n) {
	//先找待排序序列最大值和待排序序列最后一个元素交换
	for (int i = 1; i < n; i++) {      //控制排序趟数
		int index = 0;//最大值下标
		int j;
		for ( j = 0; j <= n - i; j++) {//当此循环遍历完成后j会多遍历一次,j=n-i+1,所以下面交换的j进行了减1操作
			if (arr[j] > arr[index]) {
				index = j;
			}
		}
		swap(&arr[index], &arr[j-1]);
	}
}
int main() {
	int arr[] = { 4,2,6,5,8,9 };
	int n=sizeof(arr) / sizeof(int);
	SelectSort(arr, n);//函数调用
	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

C++

#include<iostream>
#include<vector>
using namespace std;

//void swap(int* a, int* b) {      //交换数值
//	int temp = *a;
//	*a = *b;
//	*b = temp;
//}
void selectSort(vector<int>& vec, int n) {//选择排序
	int index = 0;
	int j;                       //
	for (int i = 1; i < n; i++) {//数组排完序后,最多遍历n-1次
		int flag = 0;
		for (j = 0; j <= n - i; j++) {   //当此循环遍历完成后j会多遍历一次,j=n-i+1,所以下面交换的j进行了减1操作
			if (vec[index] < vec[j]) {
				index = j;
			}
		}
		swap(vec[index], vec[j - 1]);
	}
}

int main() {
	vector<int> vec = { 6,3,9,8,5,3 };
	int n = vec.size();
	selectSort(vec, n);
	for (int i = 0; i < n; i++) {
		cout<<vec[i]<<" ";
	}
	return 0;

}

插入排序

#include<stdio.h>
void insertSort(vecrot<int>& arr,int n){//函数定义
for(int i = 0;i < n; i++){//控制无序区下标的范围
int j = i -1;//有序区最后一个元素的下标
int temp = arr[i];
for(;j >=0;j--){ //当此循环遍历完成后j会多遍历一次,j=-1,所以下面交换的j进行了加1操作
if(temp < arr[j]{
arr[j+1] = arr[j];
}
else{
break;
}
}
arr[j+1]=temp;//j在上面多减了一次
}
}
int main(){
int arr[] = {4,2,6,5,8,9};
int n = sizeof(arr)/sizeof(int);
insertSort(arr,n);
for(int i =0; i<n;i++){
printf("%d",arr[i]);
}
return 0;
}
C++
#include<iostream>
#include<vector>
using namespace std;

void insertSort(vector<int>& vec, int n) {
	for (int i = 1; i < n; i++) {//控制无序区数组的下标范围
		int temp = vec[i];   //将无序区的第一个元素有第三变量记录
		int j = i - 1;    //有序区最后一个元素(最大元素)的下标
		for (; j >= 0; j--) {   //当此循环遍历完成后j会多遍历一次,j=-1,所以下面交换的j进行了加1操作
			if (temp < vec[j]) {
				vec[j + 1] = vec[j];
			}
			else break;    //当temp与arr[j]不发生交换时,结束本次for (; j >= 0; j--) 循环
		}
		vec[j + 1] = temp;   //当无序区的某一个元素在有序区找到位置时,进行插入
	}
}
int main() {
	vector<int> vec= { 4,2,6,5,8,9 };
	int n = vec.size();
	insertSort(vec, n);
	for (int i = 0; i < n; i++) {
		cout<<vec[i]<<" ";
	}
	return 0;
}

计数排序(桶思想)

C语言
#include<stdio.h>
#include<stdlib.h>
int maxval(int* arr,){        //求要排序数组中的最大值
int max=arr[0];
for(int i = 0;i<n;i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
void bucketSort(int *arr,int n){
int max = maxval(arr,n);
int* bucket = (int*)malloc(sizeof(int)*(max + 1));   //创建一个桶数组,将桶数组的下标作为要排序的数字,桶数组内放置排序数组内相同数的个数,没有的数字对应的桶内放0
for(int i = 0; i<= max;i++){   //对桶中元素进行初始化为0的操作
bucket[i]=0;
}
for(int i = 0;i < n; i++){     //向桶内计要排序中某一个数的个数
bucket[ar[i]]++;
}
int index = 0;//在原数组中把数据放在
for(int i = 0;i<=max;i++){
while(bucket[i]>0){           
arr[index++]=i;
bucket[i]--;
}
}
free(bucket);
}
int main(){
int arr[] = {4,3,6,5,8,9};
int n = sizeof(arr)/sizeof(int);
bucketSort(arr,n);
for(int i = 0;i<n;i++){
printf("%d",arr[i]);
}
return 0;
}
C++
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int maxval(vector<int>& vec,int n) {        //求要排序数组中的最大值
	int MAX = vec[0];
	for (int i = 1; i < n; i++) {
		MAX = max(MAX, vec[i]);
		}
	return MAX;
}
void bucketSort(vector<int>& vec, int n) {
	int max = maxval(vec,n);
	   //创建一个桶数组,将桶数组的下标作为要排序的数字,桶数组内放置排序数组内相同数的个数,没有的数字对应的桶内放0//对桶中元素进行初始化为0的操作
	vector<int> bucket(max + 1, 0);
	
	for (int i = 0; i < n; i++) {     //向桶内计要排序中某一个数的个数
		bucket[vec[i]]++;
	}
	int index = 0;//在原数组中把数据放在
	for (int i = 0; i <= max; i++) {
		while (bucket[i] > 0) {
			vec[index++] = i;
			bucket[i]--;
		}
	}
}
int main() {
	vector<int> vec = { 4,3,6,5,8,9 };
	int n = vec.size();
	bucketSort(vec, n);
	for (int i = 0; i < n; i++) {
		cout<<vec[i]<<" ";
	}
	return 0;
}

堆排序

C语言

#include<stdio.h>
void swap(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}

void Adjust(int* arr, int start, int end) {
	int father = start;
	int child = father * 2 + 1;
	while (child <= end) {
		if (child + 1 <= end && arr[child] < arr[child + 1]) {
			child++;
		}
		if (arr[child] > arr[father]) {
			swap(&arr[child], &arr[father]);
			father = child;
			child = father * 2 + 1;
		}
		else {
			break;
		}
	}
}

void heapSort(int* arr, int n) {
	for (int i = n / 2 - 1; i >= 0; i--) {
		Adjust(arr, i, n - 1);
	}

	for (int j = n - 1; j >= 0; j--) {
		swap(&arr[0],&arr[j]);
		Adjust(arr, 0, j - 1);
	}
}

int main() {
	int arr[] = { 6,3,8,9,5,7,12 };
	int n = sizeof(arr) / sizeof(int);
	heapSort(arr,n);
	for (int i = 0; i < n; i++) {
		printf("%d",arr[i]);
	}
	return 0;
}

C++

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

void Adjust(vector<int>& vec, int start, int end) {
	int father = start;
	int child = father * 2 + 1;
	while (child <= end) {
		if (child + 1 <= end && vec[child] < vec[child + 1]) {
			child++;
		}
		if (vec[child] > vec[father]) {
			swap(vec[child], vec[father]);
			father = child;
			child = father * 2 + 1;
		}
		else {
			break;
		}
	}
}

void heapSort(vector<int>& vec, int n) {
	for (int i = n / 2 - 1; i >= 0; i--) {
		Adjust(vec, i, n - 1);
	}

	for (int j = n - 1; j >= 0; j--) {
		swap(vec[0], vec[j]);
		Adjust(vec, 0, j - 1);
	}
}


int main() {
	vector<int>vec = { 6,3,2,9,7,8,5,1,0 };
	int n = vec.size();
	heapSort(vec,n);
	for (int i = 0; i < n; i++) {
		cout << vec[i] << " " ;
	}
	return 0;
}






快速排序

C语言
#include<stdio.h>
#include<stdlib.h>
void Quicksort (int* arr ,int l ,int r){
if( l>=r){//基线条件
return;
}
int temp = arr[l];
int i = l - 1;
int j = r + 1;
int index = l;
while (index < j){
if (arr[index] == temp) {
index++;
}
else if ( arr[index] > temp){
swap (&arr[--j],&arr[index]);
}
else {
swap(&arr[++i],&arr[index++]);
}
ouicksort (arr,l,i); //左边递归
Quicksort (arr,j, r);//右边递归
}
int main () {
int arr[] = { 4, 2,5,9,6 };
int n = sizeof(arr) / sizeof (int) ;
Quicksort (arr , 0 , n-1) ; //函数调用
for (int i = 0 ; i < n; i++) {
printf ( "3d", arr[i] ) ;
}
return 0;
}

C++
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//void swap(int* a, int* b) {
//	int temp = *a;
//	*a = *b;
//	*b = temp;
//}
void QuickSort(vector<int>& vec, int L, int R) {
	if (L >= R) {
		return;
	}
	int i = L - 1;
	int j = R + 1;
	int index = L;
	int temp = vec[L];
	while (index < j) {
		if (vec[index] == temp) {
			index++;
		}
		else if (vec[index] > temp) {
			swap(vec[index], vec[--j]);
		}
		else {
			swap(vec[index++], vec[++i]);
		}
	}
	QuickSort(vec, L, i);
	QuickSort(vec, j, R);

}

int main() {
	vector<int> vec = { 6,2,1,8,9,7,3,0 };
	int n = vec.size();
	QuickSort(vec, 0, n - 1);
	for (int i = 0; i < n; i++) {
		cout<<vec[i]<<" ";
	}
	return 0;
}

归并排序

C语言
#include<stdio.h>
#include<stdlib.h>
void Merg(int* arr,int L,int mid,,int R){
int* temp =(int*)malloc(sizeof(int)*(R-L+l);
int i = 1;
int j = mid + 1;
int index = 0;
while(i <= mid && j<=R){
if(arr[i] <=arr[i]){
temp[index++]==arr[j++];
}
}
while(i<=mid){
temp[index++]=arr[j++];
}
while(j<=mid){
temp[index++]=arr[j++];
}
i =L;
for(index = 0;index<=R-L;index++){
arr[i++] = temp[index];
}
}
void MergSort(int* arr,int L,int R){
if(L>=R){
returm;}
int mid =(L+R)/2;
MergSort(arr,L,mid);
MergSort(arr,mid+1,R);
merg(arr,Lmid,R);
}
int main(){
int arr[] = {2,0,5,6,8,1,2,5};
int n = sizeof(arr)/sizeof(int);
MergSort(arr,0,n-1);
for(int i = 0;i<n;i++){
printf("%d",arr[i]);
}
return 0;
}
C++
#include<iostream>
#include<vector>
using namespace std;

void Merg(vector<int>& vec, int L, int mid, int R) {
	//int* p = (int*)malloc(sizeof(int) * (R - L + 1));
	vector<int> p((R - L + 1),0);//申请数组空间
	int index = 0;
	int i = L;
	int j = mid + 1;
	while (i <= mid && j <= R) {//比较数组大小,小的放入数组
		if (vec[i] <= vec[j]) {
			p[index++] = vec[i++];
		}
		else if (vec[i] > vec[j]) {
			p[index++] = vec[j++];
		}
	}
	while (i <= mid) {                //判断左半部分是否越界
		p[index++] = vec[i++];
	}
	while (j <= R) {                    //判断右半部分是否越界
		p[index++] = vec[j++];
	}
	i = L;
	for (int index = 0; index <= (R - L); index++) {//将新数组的数放入原本数组
		vec[i++] = p[index];
	}
	//free(p);
}

void MergSort(vector<int>& vec, int L, int R) {
	if (L >= R) {
		return;
	}
	int mid = (R - L) / 2 + L;//为了防止数据溢出,因此用此方法计算
	MergSort(vec, L, mid);
	MergSort(vec, mid + 1, R);
	Merg(vec, L, mid, R);   //合并

}
int main() {
	vector<int> vec = { 6,5,2,7,9,3,8 };
	int n = vec.size();
	MergSort(vec, 0, n - 1);
	for (int i = 0; i < n; i++) {
		cout<<vec[i]<<" ";
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灏~川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值