基础算法(一)

基础算法(一)

前言

蒟蒻复习,如有错请指出

一、基础排序

1.冒泡排序

冒泡排序是一种基础的排序算法,其主要原理是通过不断比较相邻元素并交换位置,将较大的元素逐渐推向序列的末尾,从而实现整个序列的排序。

冒泡排序的基本思想是:

对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素浮到顶端,最终达到完全有序。
具体步骤如下:

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

举个栗子:chestnut:

用冒泡排序把下面五个数排序为从小到大的递增序列
5 4 3 2 1
第一步:将最大的数字5浮到底端
4 3 2 1 5
第二步:将次大的数字4浮到最大的数字5前面
3 2 1 4 5
第三步:将数字3浮到次大的数字4前面
2 1 3 4 5
第四步:将次小的数字2浮到数字3前面
1 2 3 4 5

理解了冒泡排序的排序过程,再来看看使用代码如何使用冒泡排序吧!

采用例题

  1. 冒泡排序
    题目ID:1231
这一题和6318有一些不同,这一题只需要输出排序之后的数字序列

代码实现

for ( int i = 1 ; i <= n-1 ; i++) {
		for ( int j = 1 ; j <= n - i ; j++) {
			if ( a[j] > a[j+1]) {
				swap( a[j] , a[j+1]);
			}
          
		}
	}

如果题目有要求输出中间过程,那么代码的输出就应当在最后一个for循环里;只需输出排序之后序列的在结束代码之前使用for循环进行输出就好啦~

2.选择排序

选择排序的思想是:

首先在未排序序列中找到最值元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最值元素,然后放到已排序序列的末尾。
直到全部排序结束为止。

在此就不举栗了:chestnut:

采用例题

  1. 选择排序
    题目ID:1160

代码实现

for( int i = 0; i < n - 1 ; i++) {
    	int minn = i;
    	for (int j = i + 1 ; j < n ; j++)
    		if( a[j] < a[minn]) {
    			minn = j;
    		}
    	swap ( a[i] ,a[minn]);
    }
输出也是一样的

3.插入排序

插入排序基本思想是:

每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

举个栗子:chestnut:(自行

  • 4 5 3 2 1

  • 3 4 5 2 1

  • 2 3 4 5 1

  • 1 2 3 4 5

采用例题

  1. 插入排序
    题目ID:1230

代码实现

for ( int i = 2; i <= n; i++) {
		int j = i;
		while ( j != 1) {
			if ( a[j] < a[j-1]) {
				swap ( a[j] , a[j-1]);
              j--;
			} else {
				break;
			}
		}
	}

4.桶排序

桶排序的主要思想是对待排序序列的关键字数值进行分块,每一块对应一个桶,然后对每个桶使用插入排序(或其他排序算法)进行排序,最后将所有桶中的元素串联起来即得到有序序列。

桶排序是一种分配排序,通过创建多个桶,并将数据分布到这些桶中,然后对每个桶中的数据进行排序,最后将所有桶中的数据依次取出,得到有序序列。桶排序的基本思想包括以下几个方面:

分块:将待排序的序列按照关键字数值分成若干个子序列,每个子序列称为一个桶。这通常是通过计算数据值与最小值(或最大值)的差异,并根据这个差异将数据分配到相应的桶中。

局部排序:对每个桶中的数据进行排序。这可以使用任何其他的排序算法,如插入排序、快速排序等。每个桶内的排序是独立的。

合并:将所有桶中的数据按照桶的顺序依次取出,合并成一个有序序列。由于桶与桶之间是有序的,因此合并过程也是有序的。

采用例题

  1. 桶排序
    题目ID:8408

代码实现

for ( int i = 1; i <= n; i++){
		int b;
		cin >> b;
		a[b]++; 
	}
	for ( int i = 1; i <= 10000000; i++){
		while ( a[i] != 0){
			cout << i << " ";
			a[i]--;
		}
	}

未完待续

[我们下期再见!]ヾ(•ω•`)o

讲一下猴子排序qwq

orz,我记得你去年还在问语法题%%%

寒假语法进阶,现在学贪心qwq

……没写过

简单 shuffle(a+1,a+n+1);