常见排序算法(1)冒泡排序、简单选择排序、直接插入排序

目录

 C/C++实现

运行结果

C/C++实现

#include <stdio.h>
#include <cstring>
#define MAX_NUM 10
int array[10]={25,30,10,2,9,4,11,55,46,23};
//冒泡排序,时间复杂度O(n^2),空间复杂度O(1)
void MaoPaoSort(int arr[]){
    int temp;
    for (int i = MAX_NUM; i > 0; i--)
    {
        for (int j = 0; j < i-1; j++)
        {
            if (arr[j] < arr[j+1])
            {
                temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    printf("\n冒泡排序结果:");
    for(int i=0;i<MAX_NUM;i++)
        printf("%d\t",arr[i]);
}
//简单选择排序,平均时间复杂度O(n^2) ,平均复杂度O(1)
/*
*简单排序的思想和冒泡排序的思想的区别是冒泡排序是相邻关键字两两比较,如果小,则直接替换,
*可能在一轮循环会进行多次值交换。而简单选择排序法是一轮循环找到最小关键字下标,最后进行最多一次替换。
*/
void SimpleSelectionSort(int arr[]){
    int temp=0;
    for(int i=0;i<MAX_NUM;i++){
        int min = i;        //最小的脚码
        for(int j = i+1;j<MAX_NUM;j++){
            if(arr[min]<arr[j])
                min = j;
        }
        if(min != i){       //如果不相等则交换
            temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
    printf("\n简单选择排序结果:");
    for(int i=0;i<MAX_NUM;i++)
        printf("%d\t",arr[i]);
}
//直接插入排序,平均时间复杂度O(n^2) 空间复杂度O(1)
/*
*假设待排序的元素存放在数组 Data[0..n-1] 中,排序过程中的某一时刻,Data 被划分成两个子区间 Data[0..i-1] 
*和 Data[i..n-1](刚开始时 i=1,有序区只有 Data[0] 一个元素),其中,前一个子区间是已排好序的有序区,
*后一个子区间则是当前未排序的部分,称其为无序区。直接插入排序的一趟操作是将当前无序区的开头元素 Data[i] 
*(1 <= i <= n-1)插入到有序区 Data[0..i-1] 中适当的位置上,使 Data[0..i] 变为新的有序区,如下图所示。
*这种方法通常称为增量法,因为它每趟操作使有序区增加一个元素。
*/
void InsertSort(int arr[]){
    int temp,j;
    for(int i=1;i<MAX_NUM;i++){
        temp = arr[i];
        for(j=i-1;temp>=array[j]&&j>=0;j--){
            arr[j+1] = arr[j];
        }
    arr[j+1] = temp; 
    }
    printf("\n直接插入排序结果:");
    for(int i=0;i<MAX_NUM;i++)
        printf("%d\t",arr[i]);
}

int main(void){
    MaoPaoSort(array);
    SimpleSelectionSort(array);
    InsertSort(array);
}

运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值