首页 > 编程语言 >十大经典排序算法

十大经典排序算法

时间:2024-09-15 10:24:30浏览次数:3  
标签:log int void 算法 place swap 经典 排序

排序算法平均时间复杂度最好情况最坏情况空间复杂度排序方式稳定性
冒泡排序O(n^2)O(n)O(n^2)O(1)in-place稳定
选择排序O(n^2)O(n^2)O(n^2)O(1)in-place不稳定
插入排序O(n^2)O(n)O(n^2)O(1)in-place稳定
希尔排序O(n log n)O(n log^2 n)O(n log^2 n)O(1)in-place不稳定
归并排序O(n log n)O(n log n)O(n log n)O(n)out-place稳定
快速排序O(n log n)O(n log n)O(n^2)O(log n)in-place不稳定
堆排序O(n log n)O(n log n)O(n log n)O(1)in-place不稳定
计数排序O(n+k)O(n+k)O(n+k)O(k)out-place稳定
桶排序O(n+k)O(n+k)O(n^2)O(n+k)out-place稳定
基数排序O(n*k)O(n*k)O(n*k)O(n+k)out-place稳定

1、冒泡排序

#include<iostream>
using namespace std;
int a[100005];
void swap(int&a, int&b) {
	int t = a;
	a = b;
	b = t;
}
void bubbleSort(int a[], int length) {
	for (int i = length; i > 1; i--) {
		bool re = true;
		for (int j = 1; j < i; j++) {
			if (a[j] > a[j + 1]) {
				swap(a[j], a[j + 1]);
				re = false;
			}
		}
		if (re) {
			break;
		}
	}
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	bubbleSort(a, n);
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

2、选择排序

#include<iostream>
using namespace std;
int a[100005];
void swap(int&a, int&b) {
	int t = a;
	a = b;
	b = t;
}
void selectSort(int a[], int length) {
	for (int i = length; i > 1; i--) {
		int max = 1;
		for (int j = 2; j <= i; j++) {
			if (a[j] > a[max]) {
				max = j;
			}
		}
		if (i != max) {
			swap(a[i], a[max]);
		}
	}
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	selectSort(a, n);
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

3、插入排序

#include<iostream>
using namespace std;
int a[100005];
void swap(int&a, int&b) {
	int t = a;
	a = b;
	b = t;
}
void insertSort(int a[], int length) {
	for (int i = 2; i <= length; i++) {
		int j = i - 1;
		while (j >= 1 && a[j] > a[j + 1]) {
			swap(a[j], a[j + 1]);
			j--;
		}
	}
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	insertSort(a, n);
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

4、希尔排序

#include<iostream>
using namespace std;
int a[100005];
void swap(int&a, int&b) {
	int t = a;
	a = b;
	b = t;
}
void shellSort(int a[], int length) {
	for (int gap = length / 2; gap > 0; gap /= 2) {
		for (int i = gap + 1; i <= length; i++) {
			int j = i - gap;
			while (j >= 1 && a[j] > a[j + gap]) {
				swap(a[j], a[j + gap]);
				j -= gap;
			}
		}
	}
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	shellSort(a, n);
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

5、归并排序

#include<iostream>
using namespace std;
int a[100005];
void swap(int&a, int&b) {
	int t = a;
	a = b;
	b = t;
}
void merge(int a[], int begin,int mid,int end) {
	int temp[end-begin+1];
	int i=begin,j=mid+1,k=0;
	while(i<=mid&&j<=end){
		temp[k++]=a[i]<a[j]?a[i++]:a[j++];
	}
	while(i<=mid){
		temp[k++]=a[i++];
	}
	while(j<=end){
		temp[k++]=a[j++];
	}
	k=0;
	while(k<end-begin+1){
		a[begin+k]=temp[k];
		k++;
	}
}
void mergeSort(int a[],int begin,int end){
	if(begin==end){
		return;
	}
	int mid=(begin+end)/2;
	mergeSort(a,begin,mid);
	mergeSort(a,mid+1,end);
	merge(a,begin,mid,end);
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	mergeSort(a, 1, n);
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

6、快速排序

#include<iostream>
using namespace std;
int a[100005];
void swap(int&a, int&b) {
	int t = a;
	a = b;
	b = t;
}
void quickSort(int a[], int begin, int end) {
	if (begin >= end) {
		return;
	}
	int t = a[begin];
	int i = begin, j = end;
	while (i < j) {
		while (a[j] > t) {
			j--;
		}
		while (a[i] <= t && i < j) {
			i++;
		}
		if (i != j) {
			swap(a[i], a[j]);
		}
	}
	swap(a[begin], a[i]);
	quickSort(a, begin, i - 1);
	quickSort(a, i + 1, end);
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	quickSort(a, 1, n);
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

7、堆排序

#include<iostream>
using namespace std;
int a[100005];
void swap(int&a, int&b) {
	int t = a;
	a = b;
	b = t;
}
void adjust(int a[], int end, int parent) {
	int child = parent * 2;
	if (child + 1 <= end && a[child] < a[child + 1]) {
		child++;
	}
	if (a[child] > a[parent]) {
		swap(a[child], a[parent]);
		if (child <= end / 2) {
			adjust(a, end, child);
		}
	}
}
void heapSort(int a[], int length) {
	for (int i = length; i > 1; i--) {
		for (int j = i / 2; j >= 1; j--) {
			adjust(a, i, j);
		}
		swap(a[1], a[i]);
	}
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	heapSort(a, n);
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

8、计数排序

#include<iostream>
using namespace std;
int a[100005];
void swap(int&a, int&b) {
	int t = a;
	a = b;
	b = t;
}
void countingSort(int a[], int length) {
	int temp[100005] = {0};
	for (int i = 1; i <= length; i++) {
		temp[a[i]]++;
	}
	int k = 1;
	for (int i = 1; i <= 100000; i++) {
		for (int j = 0; j < temp[i]; j++) {
			a[k++] = i;
		}
	}
}
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	countingSort(a, n);
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

9、桶排序

工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序。

10、基数排序

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

标签:log,int,void,算法,place,swap,经典,排序
From: https://blog.csdn.net/xhbqy/article/details/142107549

相关文章

  • 【67种改进策略】优化算法改进再也不用担心了-matlab代码
    仅需一行代码,学会从入门到创新改进所有群智能优化算法   目录  引言一.佳点集初始化二.21种混沌初始化三.21种混沌参数化四.13种变异策略五.10种飞行/分布函数六.单纯形Nelder‑Mead单纯形法(Nelder‑Meadsimplex)Matlab代码下载点击链接跳转:引言根据“......
  • 图论篇--代码随想录算法训练营第五十九天打卡|Bellman_ford 算法精讲,SPFA算法,Bellman
    本系列算法用来解决有负权边的情况Bellman_ford算法精讲题目链接:94.城市间货物运输I题目描述:某国为促进城市间经济交流,决定对货物运输提供补贴。共有n个编号为1到n的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。网络......
  • 链表的快速排序(C/C++实现)
    一、前言大家在做需要排名的项目的时候,需要把各种数据从高到低排序。如果用的快速排序的话,处理数组是十分简单的。因为数组的存储空间的连续的,可以通过下标就可以简单的实现。但如果是链表的话,内存地址是随机分配的,不能像数组那样通过下标就直接实现。所以在这里给大家介绍......
  • 鹏哥C语言36-37---循环/分支语句练习(折半查找算法)
    #define_CRT_SECURE_NO_WARNINGS//----------------------------------------------------------------------------------------------------3.4分支,循环练习//用代码解决问题=先想办法(编程思维)+再写代码(按照语法形式)//--------------------------------------------......
  • 【算法】【线性表】【数组】买卖股票的最佳时机
    1 题目给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你......
  • 【算法】【线性表】【数组】买卖股票的最佳时机 II
    1 题目给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在同一天 出售。返回 你能获得的最大利润 。示例1:输入:prices=[7,1,5,3,......
  • 算法复杂度
    1.复杂度的概念   算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量⼀个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。   时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量⼀个算法运行所需......
  • python实现插入排序算法
    插入排序是指,在已经排序过的列表,将需要添加的数据从开头依次进行比较,找到保存的位置,并将数据进行插入排序的方法。比如列表6,15,4,2,8,5,11,9,7,13第一步6和15比较,15大,不用比较。第二步4和前面两个数比较,就是6和15,4最小,将4插入到最前面。编程语言如何实现这个过程,将4和前......
  • 算法工程师重生之第二天(长度最小的子数组 螺旋矩阵II 区间和 开发商购买土地 总结 )
    参考文献代码随想录一、长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示......
  • 【重温童年】基于tkinter模块设计的Q宠大乐斗武器升星模拟器:重温经典,畅享休闲时光
    在快节奏的现代生活中,我们总是在寻找那些能够让我们暂时忘却烦恼,沉浸在简单快乐中的休闲方式。对于许多80后、90后而言,Q宠大乐斗无疑是一款充满回忆的经典网页游戏。它以其独特的宠物养成、战斗系统以及丰富多样的武器系统,吸引了无数玩家的心。今天,就让我们一起重温那段美好的......