leetcode--912--排序数组

这篇博客探讨了四种不同的排序算法:直接插入排序、冒泡排序、快速排序和直接选择排序,它们在处理整数数组时的表现。文章通过具体示例展示了每种算法的实现,并指出这些基本排序算法在数组规模较大时可能会导致超时问题。快速排序作为其中的一种高效算法,被详细阐述并给出了实现代码。

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

1 <= nums.length <= 50000
-50000 <= nums[i] <= 50000

来源:力扣(LeetCode)
链接:leetcode–912–排序数组
代码:
使用vector的sort函数

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
       
        sort(nums.begin(),nums.end());
        return nums;
    }
};

自己写的排序代码
自接插入排序:(超时)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int n=nums.size();
        InsertSort(nums,n);
   
         return nums;
        
    }
    void InsertSort(vector<int>&nums,int n)//直接插入排序
    {
        int i,j;
        for( i=0;i<n;i++)
        {
            int temp=nums[i];
            for( j=i-1;j>=0&&nums[j]>temp;j--)//递增排序
            {
                nums[j+1]=nums[j];
            }
            nums[j+1]=temp;
        }
    }
};

冒泡排序:(超时)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int n=nums.size();
        BubbleSort(nums,n);
   
         return nums;
        
    }
    void BubbleSort(vector<int>&nums,int n)//冒泡排序
    {
        for(int i=0;i<n-1;i++)//关键在于循环n-1次
        {
            for(int j=0;j<n-i-1;j++)//关键在于循环n-i-1
            {
                int temp;
                if(nums[j]>nums[j+1])
                {
                    temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;
                }
            }
        }
    }
};

快速排序:

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
       
       int n=nums.size();
       QuitSort(nums,0,n,n);
        return nums;
    }
    void QuitSort(vector<int>& nums,int low,int high,int n)
{
    if(low<high)
    {
        int pivotpos=partition(nums,low,high);
        QuitSort(nums,low,pivotpos-1,n);
        QuitSort(nums,pivotpos+1,high,n);
    }
}
int partition(vector<int>& nums,int low,int high)
{
    int pivot=nums[low];

    while(low<high)
    {
        while(low<high&&pivot>=nums[low])//关键>=
        {
            low++;
        }
        nums[high]=nums[low];

        while(low<high&&pivot<=nums[high])//关键<=
        {
            high--;
        }
        nums[low]=nums[high];


    }
    nums[low]=pivot;
    return low;
}
};

直接选择排序:(超时)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
       
       int n=nums.size();
       SelectSort(nums,n);
        return nums;
    }
   void SelectSort(vector<int>& nums,int n)
   {
     int i,j;
       for( i=0;i<n-1;i++)
       {  
           int min=i;
           for( j=i+1;j<n;j++)
           {
               if(nums[min]>nums[j])
               {
                   min=j;
               }
           }
           if(nums[min]!=nums[i])
           {
            int temp;
           temp=nums[min];
          nums[min] =nums[i];
           nums[i]=temp;
           }
         

       }
   }
};
<think>好的,用户的问题是关于在博途(TIA Portal)中实现冒泡排序的方法或示例,但用户提到了“null”,这可能是一个拼写错误或者需要进一步澄清的地方。首先,我需要确认用户的需求是寻找在TIA Portal环境下使用结构化控制语言(SCL)或其他语言实现冒泡排序的示例代码或方法。 接下来,我需要回忆博途(TIA Portal)支持的编程语言。通常,TIA Portal支持梯形图(LAD)、功能块图(FBD)、结构化文本(ST,即SCL)等。冒泡排序作为一种算法,通常在文本型编程语言中更容易实现,因此SCL可能是最合适的选择。 然后,我需要考虑如何在SCL中实现冒泡排序。冒泡排序的基本原理是通过多次遍历数组,比较相邻元素并交换位置,直到整个数组有序。在PLC编程中,需要注意数组的索引和循环结构的使用。同时,由于PLC的扫描周期特性,可能需要将算法分解为多个步骤或使用状态机来实现,以避免扫描时间过长导致的问题。 接下来,我需要检查是否有相关的示例代码或官方文档支持在TIA Portal中实现排序算法。根据经验,西门子的官方资源库或论坛可能有用户分享的示例。此外,需要提醒用户注意数组的大小和数据类型,确保在声明数组时正确设置长度,避免越界错误。 用户提到的“null”可能是指空指针或未初始化的变量,这在PLC编程中通常不适用,因为PLC更注重实时性和可靠性,变量需要明确初始化。因此,在实现冒泡排序时,应确保所有变量和数组都被正确初始化和声明。 最后,总结实现步骤:声明数组、编写嵌套循环进行排序、添加交换标志优化、测试代码。同时,需要提醒用户在实际应用中考虑性能问题,特别是在处理大型数组时,可能需要优化算法或分步执行以避免扫描周期超时。</think>### 在博途(TIA Portal)中实现冒泡排序的方法 博途(TIA Portal)支持使用结构化控制语言(SCL)编写算法,冒泡排序可通过嵌套循环实现。以下是具体步骤和示例代码: #### 1. **声明数组** 在PLC变量表中定义静态数组(如`Array[1..10] of Int`),用于存储待排序数据。 #### 2. **SCL代码实现** ```scl FUNCTION_BLOCK BubbleSort VAR i, j, temp: INT; swapped: BOOL; arr: ARRAY[1..10] OF INT; // 示例数组 END_VAR REPEAT swapped := FALSE; FOR i := 1 TO 9 BY 1 DO // 假设数组长度为10 IF arr[i] > arr[i+1] THEN temp := arr[i]; arr[i] := arr[i+1]; arr[i+1] := temp; swapped := TRUE; END_IF; END_FOR; UNTIL NOT swapped END_REPEAT; ``` #### 3. **优化与注意事项** - **循环终止条件**:通过`swapped`标志提前终止遍历,减少无效循环次数。 - **数据类型匹配**:确保数组元素类型一致(如`INT`或`REAL`)。 - **扫描周期限制**:若数组较大,建议分步执行(如每次扫描处理一次外层循环),避免超时[^1]。 #### 4. **应用场景** - 数据监控界面中实时排序- 工艺参数调整时对输入值进行排序- 历史数据归档前的预处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值