排序
排序
1.排序的分类
排序的分类及实现方式有很多种,常见的有快速排序、归并排序、冒泡排序、桶排序等。
以下设 \(A\) 为需排序数列, \(S\) 为排好序数列。
2.排序定义
-
稳定性 :即排序之后相等元素之间输入的顺序是否改变,有跨度较大的交换操作时通常不稳定。
-
最优情况 :即序列几乎完全有序。
-
平均情况 :一般情况。
-
最坏情况 :数列基本完全无序。
3.选择排序(Selection Sort)
定义:选择排序是是一种简单直观的排序算法。它的工作原理是每次找出第 \(i\) 小的元素(也就是 \(A_1\sim A_n\) 中最小的元素),然后将这个元素与数组第 \(i\) 个位置上的元素交换。
稳定性:选择排序是一种不稳定的排序算法。
时间复杂度:选择排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为 \(O(n^2)\) 。
int r(){
int x;
scanf("%d",&x);
return x;
}
void w(int x){
printf("%d ",x);
}
int main(){
n=r();
for(int i=1;i<=n;i++)a[i]=r();//输入原数列
int ii=0;//排序数列下标
for(int i=1;i<=n;i++){
int minx=2147483647,i2=0;//记录最小值,记录最小值下标
for(int j=1;j<=n;j++){
if(!b[j]){
if(minx>a[j])
minx=a[j],i2=j;//取最小值
}
}
b[i2]=1;//标记是否选择
s[++ii]=minx;//更新排序数列
}
for(int i=1;i<=n;i++){
w(s[i]);//输出
}
return 0;
}
4.冒泡排序(Bubble Sort)
定义:冒泡排序是一种简单的排序算法。由于在算法的执行过程中,较小的元素像是气泡般慢慢「浮」到数列的顶端,故叫做冒泡排序。
它的工作原理是每次检查相邻两个元素,如果前面的元素与后面的元素满足给定的排序条件,就将相邻两个元素交换。当没有相邻的元素需要交换时,排序就完成了。
经过 \(i\) 次扫描后,数列的末尾 \(i\) 项必然是最大的 \(i\) 项,因此冒泡排序最多需要扫描 \(n-1\) 遍数组就能完成排序。
稳定性:冒泡排序是一种稳定的排序算法。
时间复杂度:
-
在序列完全有序时,冒泡排序只需遍历一遍数组,不用执行任何交换操作,时间复杂度为 \(O(n)\) 。
-
在最坏情况下,冒泡排序要执行 \((n-1)n/2\) 次交换操作,时间复杂度为 \(O(n^2)\) 。
-
冒泡排序的平均时间复杂度为 \(O(n^2)\) 。
int main(){
n=r();
for(int i=1;i<=n;i++)a[i]=r();
bool ok=0;
do{
ok=0;
for(int i=2;i<=n;i++){
if(a[i-1]>a[i]){
swap(a[i-1],a[i]);
ok=1;
}
}
}while(ok);
for(int i=1;i<=n;i++)w(a[i]);
return 0;
}
5.归并排序(Merge Sort)
定义: 归并排序是一种基于分治思想的高效的排序算法。
归并排序每次将序列二分,然后递归对左右排序,最后将序列合并。
稳定性: 归并排序是一种有序的排序算法。
时间复杂度:
归并排序的最好、平均及最坏情况下均为 \(O(N\times logN)\) .