常见的几种排序

博客介绍了几种常见的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序和归并排序,建议具体内容去百度百科查看。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体的直接去百度百科看介绍
第一种:冒泡排序

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

int main(void) {
	int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
/*
一般写函数的话英文为BubbleSort()
因为每一趟从头到尾的排序,都会把一个最大的放在最后,所以需要n-1躺
*/

	for (int i = 0; i < 9; i++) {//一共需要来回九躺
		for (int j = 0; j < 9 - i; j++) {//因为每一次结束,后面已经定下位置的就不需要继续参与比较了
			if (a[j] > a[j + 1]) {
				int t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}
		}
	}

	for (int i = 0; i < 9; i++)
		printf("%d ", a[i]);
	printf("%d\n", a[9]);

	return 0;
}

二:选择排序

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

int main(void) {
	int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
/*
一般写函数的话英文为SelectSort()
因为每一趟要找出一个最小的排在前面
*/
	int index;//index用来找到第i+1小的数的下标
	for (int i = 0; i < 10; i++) {
		index = i;
		for (int j = i + 1; j < 10; j++) {
			if (a[j] < a[index]) {
				index = j;
			}
		}

		int t = a[index];
		a[index] = a[i];
		a[i] = t;
	}


	for (int i = 0; i < 9; i++)
		printf("%d ", a[i]);
	printf("%d\n", a[9]);

	return 0;
}

三:插入排序

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

int main(void) {
	int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
/*
一般写函数的话英文为InsertSort()
首先规定第一个是已经排过顺序的,从第二个开始依次插入已排过顺序的序列中
*/
	for (int i = 1; i < 10; i++) {//默认第一个数,也就是a[i]已经是排完顺序的
		int InsertValue = a[i];//插入的数据
		int InsertIndex = i - 1;//插入的坐标,即在i-1处插入

//InsertIndex <0 说明在已经排过序的数据中,没有比插入的数更小的
		//而且在比较的过程中,若该位置的数据比插入的数据大,那么该位置的数据就往后移动一位
		while (InsertIndex >= 0 && InsertValue < a[InsertIndex]) {
			a[InsertIndex + 1] = a[InsertIndex];
			InsertIndex--;
		}

		a[InsertIndex + 1] = InsertValue;
	}


	for (int i = 0; i < 9; i++)
		printf("%d ", a[i]);
	printf("%d\n", a[9]);

	return 0;
}

四:希尔排序

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

int main(void) {
	int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
/*
一般写函数的话英文为ShellSort()
先分组,然后对每组元素都进行插入排序,
分组按照长度/2
*/
	int len = 10;
	for (int gap = len / 2; gap > 0; gap /= 2) {
		//对数组元素分组
		for (int i = gap; i < len; i++) {
			//遍历各组元素
			for (int j = i - gap; j >= 0; j -= gap) {
				if (a[j] > a[j + gap]) {
					int t = a[j];
					a[j] = a[j + gap];
					a[j + gap] = t;
				}
			}
		}
	}


	for (int i = 0; i < 9; i++)
		printf("%d ", a[i]);
	printf("%d\n", a[9]);

	return 0;
}

五:快速排序:

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

int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
void QuickSort(int left, int right);

int main(void) {
/*
一般写函数的话英文为QuickSort()
*/
	QuickSort(0, 9);

	for (int i = 0; i < 9; i++)
		printf("%d ", a[i]);
	printf("%d\n", a[9]);

	return 0;
}

void QuickSort(int left, int right) {
	int i, j, t;

	if (left >= right)
		return;

	int temp = a[left];//temp就是基准数
	i = left;
	j = right;
	while (i != j) {
		while (a[j] >= temp && i < j)
			j--;
		while (a[i] <= temp && i < j)
			i++;

		if (i < j) {
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}

	//将基准数归位
	a[left] = a[i];
	a[i] = temp;

	QuickSort(left, i - 1);
	QuickSort(i + 1, right);
}

六:归并排序

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

int n;
int a[20] = { 0 };
int b[20];

void GetData();
void MergeSort(int *a, int left, int right, int *b);
void Merge(int *a, int left, int right, int mid, int *b);
void PrintData();

int main(void) {
	scanf("%d", &n);

	GetData();
	MergeSort(a, 0, n - 1, b);
	PrintData();

	return 0;
}

void GetData() {
	for (int i = 0; i < n; i++)
		scanf("%d", &a[i]);
}

void MergeSort(int *a, int left, int right, int *b) {
	if (left < right) {
		int mid = (left + right) / 2;//中间索引
		MergeSort(a, left, mid, b);
		MergeSort(a, mid + 1, right, b);
		Merge(a, left, right, mid, b);
	}
}

void Merge(int *a, int left, int right, int mid, int *b) {
	int i = left;//左边有序序列的初始索引
	int j = mid + 1;//右边有序序列的初始索引
	int t = 0;//指向b数组的当前索引,
	//先把左右两边(有序数据)按规则填到b数组中
	//直到左右两边的有序序列,有一边处理完成为止
	while (i <= mid && j <= right) {
		//如果左边有序当前元素小于或等于右边有序当前元素
		//那么就把左边的元素填到b数组中
		if (a[i] < a[j]) {
			b[t++] = a[i++];
		}
		else {
			b[t++] = a[j++];
		}
	}

	while (i <= mid) {
		//此时说明左边序列还有剩余元素,全部填到b数组中
		b[t++] = a[i++];
	}

	while (j <= right) {
		b[t++] = a[j++];
	}
	//将b数组内容复制到a数组内容
	t = 0;
	int _left = left;
	while (_left <= right) {
		a[_left++] = b[t++];
	}
}

void PrintData() {
	int i;
	for (i = 0; i < n - 1; i++)
		printf("%d ", a[i]);
	printf("%d\n", a[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值