排序的作用非常广泛,除了给数列排序外,还有许多应用。
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)\),是稳定排序算法。
浙公网安备 33010602011771号