龙空技术网

C++选择排序、冒泡排序、插入排序和计数排序

黑猫编程 164

前言:

此时咱们对“冒泡算法c语言程序输入五个数”大体比较看重,姐妹们都想要了解一些“冒泡算法c语言程序输入五个数”的相关资讯。那么小编同时在网络上收集了一些对于“冒泡算法c语言程序输入五个数””的相关内容,希望姐妹们能喜欢,咱们一起来了解一下吧!

什么是排序算法?

排序算法是一种用于将一组元素按照一定顺序排列的算法。这种排序可以按照升序(从小到大)或降序(从大到小)的方式进行。排序算法是计算机科学中的基本问题之一,因为在实际应用中,经常需要对数据进行排序以便更方便地进行搜索、查找或其他操作。

之前,我们学习过 sort 排序库函数,本节我们讲解几种常见排序算法原理。

排序算法稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序算法是稳定的;否则称为不稳定的。

稳定的排序可以利用上一次的排序结果,来服务这次的排序。

判断方法:排序时是否只有相邻元素交换如果是,那么排序算法稳定的;如果不是,那么排序算法是不稳定的。

例题:朴素排序模版选择排序

选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前面。

时间复杂度:O(n^2), 辅助空间复杂度:O(1), 不稳定。

#include <iostream>  using namespace std; int n;int a[110];int main(){		cin >> n;    for(int i = 1; i <= n; i++) cin >> a[i];        // n - 1 轮循环    for(int i = 1; i < n; i++){        int idx = -1, minv = 1e9;        for(int j = i + 1; j <= n; j++){            if(a[j] < a[i] && a[j] < minv){                minv = a[j];                idx = j;            }        }                if(idx != -1)            swap(a[i], a[idx]);    }	    for(int i = 1; i <= n; i++) cout << a[i] << " ";	return 0;}
冒泡排序

冒泡排序:依次比较两个相邻的元素,如果顺序错误就把他们交换过来。每次冒泡,最大(最小)的元素会经由交换“浮”到序列顶端。多次冒泡后,即可完成排序。

时间复杂度:O(n^2), 辅助空间复杂度:O(1),稳定。

冒泡排序——朴素版

#include <iostream>  using namespace std; int n;int a[110];int main(){		cin >> n;    for(int i = 1; i <= n; i++) cin >> a[i];        for(int i = 1; i < n; i++){		for(int j = 1; j < n; j++){            if(a[j] > a[j + 1])                swap(a[j], a[j + 1]);        }                }	    for(int i = 1; i <= n; i++) cout << a[i] << " ";	return 0;}
冒泡排序优化——提前跳出

如果序列已经有序,就没有必要进行后面的循环。

#include <iostream>  using namespace std; int n;int a[110];int main(){		cin >> n;    for(int i = 1; i <= n; i++) cin >> a[i];        for(int i = 1; i < n; i++){        bool flag = true;		for(int j = 1; j <= n - i; j++){            if(a[j] > a[j + 1]){                swap(a[j], a[j + 1]);                flag = false;            }            }        if(flag) break;                }	    for(int i = 1; i <= n; i++) cout << a[i] << " ";	return 0;}
插入排序

插入排序:假设前面n-1个数已经是有序的,现将第n个数插到前面已经有序的序列中,使得插入后这个序列仍然是有序的。

时间复杂度:O(n^2), 辅助空间复杂度:O(1),稳定。

方案1:

#include <iostream>using namespace std;int n;int a[110];int main() {	cin >> n;	for (int i = 1; i <= n; i++) cin >> a[i];	// 插入排序	for (int i = 2; i <= n; i++) {		int t = a[i];		int k = 1;		while (a[k] <= t && k < i) k++;		for (int j = i; j > k; j--) a[j] = a[j - 1];		a[k] = t;	}	for (int i = 1; i <= n; i++) cout << a[i] << " ";	return 0;}

方案2:

#include <iostream>using namespace std;int n;int a[110];int main() {	cin >> n;	for (int i = 1; i <= n; i++) cin >> a[i];	// 插入排序	for (int i = 2; i <= n; i++) {		int j = i;        while(j && a[j] < a[j - 1]){            swap(a[j], a[j - 1]);            j--;        }	}	for (int i = 1; i <= n; i++) cout << a[i] << " ";	return 0;}
桶排序

桶排序:将数据分到有限数量的有序的桶里,每个桶内分别排序,最后将各个桶中的数据合并

数据分配到桶:散列过程

计数排序

计数排序:是一种特殊的桶排序。桶的个数是可能出现的数据种类数。

计数数组:数组下标是桶的编号,通常为数据值,

数组的值表示数据个数

适用条件:待排序数据为整数,数据范围有限。

设数据个数为n,数据范围为k。

时间复杂度:O(n+k),额外空间复杂度:O(k),稳定。

构造计数数组

最终数组:

至此,排序已经完成,但是并不稳定。

构造前缀和 cnts 数组:

结果数组为 results:results[--cnts[a[i]]] = a[i];

#include <iostream>using namespace std;const int N = 1010;int n;int a[N], cnts[N], results[N];int main() {    	cin >> n;	for (int i = 0; i < n; i++) {		cin >> a[i];		cnts[a[i]]++;	}		for (int i = 0; i < N; i++)		cnts[i+1] += cnts[i];		// 为了稳定排序,从后向前遍历 	for (int i = n - 1; i >= 0; i--) {		results[--cnts[a[i]]] = a[i];	}	for (int i = 0; i < n; i++)		cout << results[i] << " ";    	return 0;}
稳定排序库函数

sort 是不稳定排序,时间复杂度为 O(nlogn)。

stable_sort 是稳定排序,时间复杂度也为 O(nlogn)。

stable_sort(起始元素指针,最后一个元素的指针的后一个位置, 比较函数);//对数组 a下标 1 到 n 进行排序stable_sort(a+1,a+1+n, cmp);

比较函数:传入两个数组中元素类型的参数,返回第一个参数排在前面的条件。

若不写比较函数cmp,默认为升序排序。

binary_search

在有序序列中,查找某个元素是否存在可以使用二分法。

binary_ search(开始位置, 结束位置, 要找的元素)。// 二分查找某个元素,时间复杂度为 O(logN)。如果在一个范围内找到值,返回 true,否则返回 false。 
疯狂刷题

P630 车厢重组

P61 [NOIP 2006 普及组] 明明的随机数

P90 美人松的高度2

标签: #冒泡算法c语言程序输入五个数 #c程序冒泡法排序5个数 #c语言冒泡法排序n个数 #c语言用冒泡排序法对n个数从小到大排列 #c语言冒泡排序10个数从小到大