排序的作用非常广泛,除了给数列排序外,还有许多应用。

1 选择排序

选择排序是一种时间复杂度为 \(O(n^2)\) 的不稳定排序算法。

所谓“不稳定”,并不是说排序完的结果无序,而是指如果数组中有两个相等的数,排序完它们的相对顺序改变,则该排序算法不稳定。这个知识点会在 CSP 和 GESP 等考试中考察。

选择排序的思想,是每次在未排序的部分选出最小(最大)的,拼到已排序的部分的后面。以此完成排序。

还是举个例子(升序排序。已排序部分标红):

原序列:

\(7 3 2 5 4\)

第一次在未排序的部分中选出最小的数为 \(2\),与 \(7\) 交换位置。

\(\color{red}{2}\)\(7354\)

第二次在未排序的部分中选出最小的数为 \(3\),与 \(7\) 交换位置。

\(\color{red}{23}\)\(754\)

第三次在未排序的部分中选出最小的数为 \(4\),与 \(7\) 交换位置。

\(\color{red}{234}\)\(75\)

第四次在未排序的部分中选出最小的数为 \(5\),与 \(7\) 交换位置。

\(\color{red}{2345}\)\(7\)

第四次在未排序的部分中选出最小的数为 \(5\),与 \(7\) 交换位置。

\(\color{red}{2345}\)\(7\)

第五次在未排序的部分中选出最小的数为 \(7\),与 \(7\) 交换位置。

\(\color{red}{23457}\)

排序结束。

代码实现:

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

2 插入排序

原理:将序列分成已排序和未排序部分。每次将每一个未排序的元素插入到已排序序列中的正确位置。

还是举个例子(升序排序。已排序部分标红):

原序列:

\(7 3 2 5 4\)

第一次在未排序的部分中选出 \(7\)

\(\color{red}{7}\)\(3254\)

第二次在未排序的部分中选出 \(3\),插入到 \(7\) 前面。

\(\color{red}{37}\)\(254\)

第三次在未排序的部分中选出 \(2\),插入到 \(3\) 前面。

\(\color{red}{237}\)\(54\)

第四次在未排序的部分中选出 \(5\),插入到 \(7\) 前面。

\(\color{red}{2357}\)\(4\)

第四次在未排序的部分中选出 \(4\),插入到 \(5\) 前面。

\(\color{red}{23457}\)

排序结束。

代码实现:

for (int i=1; i<n; i++) {
	int k=a[i];
	int j=i-1;
	while(j>=0&&a[j]>k) {
		a[j+1]=a[j];
		j--;
	}
	a[j+1]=k;
}

结合代码和排序过程,我们可以知道插入排序的时间复杂度为 \(O(n^2)\),是稳定排序算法。

posted on 2026-07-01 16:17  lz5332t  阅读(3)  评论(0)    收藏  举报