排序(左神初级)p3

本文探讨排序算法的稳定性,列举稳定与不稳定算法,并详细解析计数排序的实现过程及应用场景,包括针对正整数排序的具体步骤和代码示例。

排序稳定性:

稳定的排序算法有:冒泡、插入、归并、桶排序 

不稳定的算法:快排、选择、堆排

 

1.计数排序(只能排序正整数)

1.计数排序不基于比较,准备max值+1个桶;
2.遍历数组,数值为a时,把桶位置为a的数加一;
3.重构数组。

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
       
       int maxn=INT_MIN;
       for(int i=0;i<nums.size();i++){
           maxn=max(maxn,nums[i]);
       }
       vector<int> bucket(maxn+1,0);

       for(int i=0;i<nums.size();i++){
           bucket[nums[i]]++;
       }
       int j=0;
       for(int i=0;i<bucket.size();i++){
           while(bucket[i]--){
              nums[j++] = i;
           }
       }
       return nums;
    }
};

2.应用

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。

1.假设有N个数,则准备N+1个桶;

2.遍历,得到最大max、最小值min,若相等,则返回0;

3.最大值max和最小值min分别放在[N]和[0]桶位置;

4.将max~min N+1等分,中间某个元素属于哪个范围就放置进去,中间必然存在一个空桶;

5.准备三个长度为N+1的数组,分别为nmax[],nmin[] ,nempty[]。表示当前位置桶内的最大值、最小值和桶是否为空。把数组填入N+1个桶中,更新最大值、最小值;

6.从1号桶开始,如果桶为空则继续下一个,若桶非空找前一个非空桶的最大值和当前桶的最小值求差值。

#include<iostream>
#include <algorithm>
#include <windows.h>

#define length 10
using namespace std;

int main(){
   int nums[length]={-4,18,1,23,3,52,7,9,66,11} ;
   int minm=INT_MAX;
   int maxm=INT_MIN;
   //找到最大最小值
   for(int i=0;i<length;i++){
      minm=minm<nums[i]?minm:nums[i];
      maxm=maxm>nums[i]?maxm:nums[i];
  }
  //三个数组,是否为空、最大、最小值
  //一定,一定,一定要初始化为0!!!
  bool mempty[length+1]={0};
  int mmax[length+1]={0};
  int mmin[length+1]={0};
 
  for(int i=0;i<length+1;i++){
    //该数在哪一个桶里(这个公式有待商榷)
     int a = (nums[i]-minm)*(length+1) / (maxm-minm);
    //桶为空,则最大最小值=该数
    if(mempty[a]==0){
        mmax[a]=nums[i];
        mmin[a]=nums[i];
        mempty[a]=1;
   //不为空则更新
    }else{
        mmax[a]=mmax[a]>nums[i]?mmax[a]:nums[i];
        mmin[a]=mmin[a]<nums[i]?mmin[a]:nums[i];
    }
  }
  
  //桶不为空,则计算和前一个非空桶的差值,不断更新
  int large=mmax[0],res=0;
  for(int i=0;i<length+1;i++){
        if(mempty[i]!=0){
      res=max(res,mmin[i]-large);
      large=mmax[i];

        }
  }
  cout<<res<<endl;
  system("pause");
}

 

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值