超级无敌各种排序算法 一个代码解决<可以做后序模板>

本次排序算法有:

一、冒泡排序 时间复杂度(O(n²))

二、选择排序 时间复杂度(O(n²))

三、插入排序 时间复杂度(O(n²))

四、希尔排序 时间复杂度(O(n²))

五、快速排序 时间复杂度(O(nlog2n)) 最坏是O(n²) 最好O(n) 最坏是当整个数组是逆序排列的时候,如我们需要输出一个升序数组 1 2 3 4 5 6 7 但是输入的数组是 7 6 5 4 3 2 1 这样每次都需要交换比较 时间复杂度就是O(n²)  当输入的数组就是1 2 3 4 5 6 7的时候 快速排序的时间复杂度是O(n) 因为每次都不需要交换,只需要比较 。下面就先给大家展示部分代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int a[20];
int n;

void bobsort(){  //冒泡排序代码
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-i-1;j++)
            {
                if(a[j]>a[j+1])
                    swap(a[j],a[j+1]);
            }
    }
}
void choose(){  //选择排序代码
    int min_position;
    for(int i=0;i<n;i++){
        min_position=i;
        for(int j=i+1;j<n;j++){
            if(a[min_position]>a[j])
                min_position=j;
        }
        swap(a[i],a[min_position]);
    }
}

void quick_sort(int begin,int end){  //快速排序代码
    if(begin>end)
        return ;
    int flag=a[begin];
    int i=begin;
    int j=end;
    while(i<j){
        while(flag<=a[j]&&j>i)
            j--;
        a[i]=a[j];
        while(flag>=a[i]&&j>i)
            i++;
        a[j]=a[i];

    }
    a[i]=flag;
    quick_sort(begin,i-1);
    quick_sort(i+1,end);
}
int main(){
    cin >> n;
    for(int i=0;i<n;i++)
        cin >> a[i];
    quick_sort(0,n-1);
    //choose();
    //bobsort();
    for(int i=0;i<n;i++)
        cout << a[i] << endl;
}

首先分析冒泡排序 他的原理其实非常简单,之所以叫他冒泡排序的原因是他每次就选出一个元素,因此称为冒泡排序。比如我们输入 3 2 1 6 5 4 这六个数,冒泡排序的原理就是 首先取出最前面的元素 然后和他后面的一个元素进行对比,在这里就是取前面的3 和后面的2进行对比 如果大于后面的数就把两个数进行交换 交换完之后数组就变成了2 3 1 6 5 4 然后用第二个数和第三个数进行比较 重复第一个操作 再然后 第三个和第四个进行对比,比对完成一个循环之后 最后的一个数就是最大的 之后我们进行下一个循环还是从第一个元素进行比较 仍然进行原来的操作,但这次循环只是循环到最后一个元素的前面一个 因为最后一个经过第一轮操作已经确定是最大的了。之后一直循环 得到正确的数组。

第二个分析插入排序 插入排序就是 从第二个元素开始和前面的比较,如果比前面的大就插入到后面 如果小于前面 就插入到前面 当然 如果前面有许多元素需要一个一个找,找到合适的位置再插入即可。

选择排序的原理和冒泡排序的原理相似,第一次取数组的第一个元素,并把第一个元素设置成最小值,定一个变量记录他的位置,然后依次和后面的所有元素比较,如果有比他小的 记录一下比它小的元素的位置,然后用比它小的元素代替最小值,这样循环完一次之后我们会得到一个最小值还有最小值的位置,然后把最小值和第一个数换一下位置,这样元素第一个数就是最小的了,之后我们进行第二次循环 因为第一次循环已经把第一个位置确定为最小的了,所以第二次循环就从第二个数开始 重复第一次循环的操作,最后 经过循环可以得到一个升序序列。

快速排序的原理就是使用了一个类似于(分割法 我原创的叫法.jpg) 其中的原理就是首先选择一个基准,我们通常认为是序列的第一个数,然后用一个变量保存一下,然后两个变量 low 和high分别从两边往里面收缩,注意先是high移动,寻找到比基准小的数停止循环,然后和low当前指的位置交换,然后从low开始 找到比基准大的停止 把当前位置和high指向的位置交换,然后high继续 直到i=j或者i>j的时候停止 当i=j的时候 把i指向的地方当中分界分成两份 然后那两份依次进行这个操作 一直循环到排序完成。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值