排序算法-09-排序1 排序 (25分)-第一部分

本文详细介绍了五种常见的排序算法:冒泡排序、插入排序、希尔排序、选择排序和堆排序。每种排序算法都包含其基本思想、代码实现和性能分析。冒泡排序和插入排序在数组基本有序时效率较高,希尔排序通过间隔序列改进了交换效率。选择排序时间复杂度始终为O(N^2)。堆排序则以O(NlogN)的时间复杂度提供稳定性能。归并排序利用分治策略,时间复杂度同样为O(NlogN),但在归并过程中需要额外空间。
摘要由CSDN通过智能技术生成

冒泡排序

  • 大概的思想
    一趟冒泡排序之后,最大的数在最后;第二趟冒泡之后,次大的数在倒数第二位。
    其中一个优化措施是 用一个变量flag标识这一趟冒泡中是否有过交换,如果没有的话,说明数组已经有序了。
  • 代码
#include <stdio.h>
#define ElementType long
#define maxn 100001

ElementType A[maxn];

void Swap(ElementType A[], int i, int j);
void Bubble_sort(ElementType A[],int N);
int main(int argc, const char * argv[]) {
    int N;
    scanf("%d",&N);
    for(int i=0; i<N; i++){
        scanf("%ld",&A[i]);
    }
    
    Bubble_sort(A, N);
    
    printf("%ld",A[0]);
    for(int i=1; i<N; i++){
        printf(" %ld",A[i]);
    }
    printf("\n");
    return 0;
}

void Swap(ElementType A[], int i, int j){
    ElementType tmp = A[i];
    A[i] = A[j];
    A[j] = tmp;
}
void Bubble_sort(ElementType A[],int N){
    int flag,i,j;
    for(i=N-2; i>=0; i--){
        flag = 0;
        for(j=0; j<=i; j++){
            if(A[j] > A[j+1]){
                Swap(A, j, j+1);
                flag = 1;       //标识发生了交换

            }
        }
        if(flag == 0)   break;//全程无交换,说明前面已经全部有序了,不需要再比较
    }
    
}

  • 运行结果
    冒泡排序结果
  • 小结
    最坏时间复杂度是O(N^2),如果数组基本有序,那么经过若干趟排序之后数组就可能是有序的,所以可能复杂度是O(N),所以通过了测试点8
    评价:交换排序,简单排序,最坏时间复杂度是O(N^2),在数组基本有序的情况下时间复杂度可能是O(N)。空间复杂度O&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值