史上最全排序算法总结(hhhhh)

插入排序 :(直接插入排序,希尔排序)
交换排序:(起泡排序,快速排序)
选择排序:(简单选择排序,堆排序)
归并排序:
基数排序:

直接插入排序

*:
直接插入排序很简单。
基本思想是把第一个元素看成是一个有序数列,然后依次从第二个数据元素起逐个插入到有序数列中。将elem[i] 插入到elem[0]~slem[i-1]中.

#include<iostream>
#include<cstdio>
using namespace std;
const int N=35;
int a[N];
int main(){
for(int i=0;i<10;i++){   //插入十个无序的number
scanf("%d",&a[i]);
}
for(int i=1;i<=9;i++){
int e=a[i];
int j;
for( j=i-1;j>=0 && a[j]>e;j--){   //如果插入的数比与相比较的数小就继续循环,否则就停止
            a[j+1]=a[j];
}
        a[j+1]=e;
}
for(int i=0;i<10;i++){   //输出排序后的序列
printf("%d ",a[i]);
}
}

希尔排序:的基本思想是先将整个序列分割成若干的子序列,,然后再分别对子序列进行直接插入排序,最后在对整体进行一次插入排序。

设增量为d;(n为元素的总个数)
第一tang的个数为n/2;
第二趟的个数为n/4,依次递推******
一共需要多少趟的计算方法:

    for(int i=0;;i++){
        if(sun!=0){
        sun=sun/2;
        src[i]=sun;
        num++;
        }
        else{
            break;
        }
    }
    num-1为所需要的趟数;

每一趟希尔排序需要进行多少次直接排序:
相邻的两个元素之间隔src:
这些都是需要注意的地方!

#include<iostream>
#include<cstdio>
using namespace std;
const int N=35;
int a[N];
int src[N];
void shellsort(int n,int src){
    for(int i=src;i<n;i++){//每趟都进行直接排序
        int e=a[i];
        int j;
        for( j=i-src;j>=0 && a[j]>e;j=j-src){
            a[j+src]=a[j];
        }
        a[j+src]=e;
    }
}
int main(){
    int n;
    int num=-1;
    scanf("%d",&n);
    int sun=n;
    //求增量的方法
    for(int i=0;;i++){
        if(sun!=0){
        sun=sun/2;
        src[i]=sun;
        num++;
        }
        else{
            break;}
    }
       //输入数据
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    //进行希尔排序
    for(int i=0;i<num;i++) {
        shellsort(n,src[i]);
    }
    // 输入排序后的序列
    for(int i=0;i<n;i++){
        printf("%d ",a[i]);
    }
 }

起泡排序:

对于n个数排序,需要起泡n-1次,并且每次起泡是将最大的数字移动到数组的末端,
所以第i此排序需要比较的元素个数为:n-i;

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int b[15]
int main(){
    int x;
    scanf("%d",&x);
    for(int i=0;i<x;i++){
        scanf("%d",&b[i])
    }
    for(int i=0;i<x-1;i++){
        for(int j=0;j<x-i;j++){
            if(b[j]>b[j+1])
            swap(b[j],b[j+1]);
        }
    }
     for(int i=0;i<x;i++){
        printf("%d",b[i]);
    }
}

快速排序

选中枢(通常选取low为中枢的位置)
1.排好中枢的位置后,
排中枢的思想为把比中枢小的数放到左边,比中枢大的数放到右边。
2.排中枢左边,
3.排中枢右边
递归排序中枢左边,递归排序中枢右边,
直到low=high递归停止。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[35];
int Control(int low,int high){
   while(low<high){
    while(low<high && a[high]>=a[low]){
        high--;
    }
    swap(a[low],a[high]);
    while(high>low && a[high]>=a[low]){

        low++;
    }
    swap(a[low],a[high]);
   }
   return low;
}
int main(){
    int x;
    scanf("%d",&x);
    for(int i=0;i<x;i++){
        scanf("%d",&a[i]);
    }
    int low=0;
    int high=x-1;
    int sum=Control(low,high);
    Control(low,sum-1);
    Control(sum+1,high);
    for(int i=0;i<x;i++){
        printf("%d ",a[i]);
    }
}


选择排序

简单的选择排序
主要思想:
第i趟是从第elem[i]----到elem[n-1]选择第i小的数并将元素放在elem[i]的位置上,也就是说从未排序的元素中找出最小的元素,放在排序的对列的最后边。

#include <iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int c1[15];
int main()
{
   int n;
   scanf("%d",&n);
   for(int i=0;i<n;i++){
    scanf("%d",&c1[i]);
   }
   //简单选择排序
   for(int i=0;i<n-1;i++){   //n个元素需要进行n-1次简单选择排序
        int lowindex=i;
        for(int j=i+1;j<n;j++){
            if(c1[lowindex]>c1[j]){
                lowindex=j;
            }
                swap(c1[lowindex],c1[i]);
        }
   }
   for(int i=0;i<n;i++){
    printf("%d ",c1[i]);
   }
}

堆排序排序算法
堆排序算法的步骤
1.把无序的序列变成大顶堆(小顶堆)(初始堆的建立)
我们要注意在这个过程中可以从第(n-2)/2个元素开始进行筛选,建立大顶堆。需要筛选(n-2)/2次

   for(int i=(n-2)/2;i>=0;--i){  // 将无序的序列调整为大顶堆
     SiftAdjust(i,n-1);
   }

2.如果是大顶堆,并且从小到大输出排序序列,每次调换low,high的位置后,还应该对现在的堆进行排序,使它调整为新堆。

   for(int i=n-1;i>0;--i){   //输出一个当前最大的元素后,还需要进行一次堆排序
    swap(elem[0],elem[i]);
    SiftAdjust(0,i-1);
   }


这个图片是每次进行堆排序的过程!

#include <iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int elem[15];
void SiftAdjust(int low,int high){    //进行堆排序的算法
    //elem[low]---elem[high]中的元素成为一个大顶堆
    for(int f=low,i=low*2+1;i<=high;i=2*i+1){
        if(i<high&&elem[i]<elem[i+1]){
            i++;
        }
        if(elem[f]>=elem[i]){
            //已经是大顶堆
            break;
        }
        swap(elem[i],elem[f]);
        f=i;      //调整新的结点
    }
}
int main()
{
   int n;
   scanf("%d",&n);
   for(int i=0;i<n;i++){
    scanf("%d",&elem[i]);
   }
   for(int i=(n-2)/2;i>=0;--i){  // 将无序的序列调整为大顶堆
     SiftAdjust(i,n-1);
   }
   for(int i=n-1;i>0;--i){   //输出一个当前最大的元素后,还需要进行一次堆排序
    swap(elem[0],elem[i]);
    SiftAdjust(0,i-1);
   }
   for(int i=0;i<n;i++){
    printf("%d ",elem[i]);
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com
可以使用以下代码实现: ```html <template> <div class="container" style="width: 400px; height: 600px; overflow: hidden;"> <div class="list" style="height: 1600px; position: relative; top: 0px; transition: top 1s;"> <div v-for="(item, index) in list" :key="index" class="item" style="width: 400px; height: 200px; position: absolute; top: {{index*200}}px;"> <div>{{item.name}}</div> <div>{{item.event}}</div> </div> </div> </div> </template> <script> export default { data() { return { list: [ { name: 'csw1', event: 'hhhhh' }, { name: 'csw2', event: 'hhhhh' }, { name: 'csw3', event: 'hhhhh' }, { name: 'csw4', event: 'hhhhh' }, { name: 'csw5', event: 'hhhhh' }, { name: 'csw6', event: 'hhhhh' }, { name: 'csw7', event: 'hhhhh' }, { name: 'csw8', event: 'hhhhh' } ] } }, mounted() { setInterval(() => { this.list.push( { name: 'new1', event: 'new event1' }, { name: 'new2', event: 'new event2' }, { name: 'new3', event: 'new event3' } ) }, 10000) setInterval(() => { let listHeight = this.list.length * 200 let containerHeight = 600 let top = parseInt(this.$el.querySelector('.list').style.top) if (top <= -(listHeight - containerHeight)) { top = 0 } this.$el.querySelector('.list').style.top = (top - 200) + 'px' }, 5000) } } </script> ``` 这段代码使用了 Vue2 的模板语法,通过 v-for 指令渲染了列表数据,并将每条数据放在一个宽400px高200px的盒子里。然后使用了定时器来定时向列表中添加新数据,并使用另一个定时器来实现从下往上的轮播效果。其中,通过设置容器的高度和溢出隐藏来实现了只显示一定数量的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值