排序

排序

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)\) .

posted @ 2024-07-17 01:06  cannotmath  阅读(22)  评论(0编辑  收藏  举报