选择排序,但每次迭代只有一个开关

Posted

技术标签:

【中文标题】选择排序,但每次迭代只有一个开关【英文标题】:Selection Sort but just one switch each iteration 【发布时间】:2022-01-09 03:28:42 【问题描述】:

我编写了一个选择排序算法,它由两个 for 循环组成。截至目前,内循环可能会在增加外循环之前多次交换数字。但是,我现在的目标是让内部循环恰好交换一次数字,然后返回外部 for 循环并重复此操作,直到对数组进行排序。我已经尝试过使用 break 语句,但它并没有正确地对整个事情进行排序。

    private static void selectionSort(int[] array)         //Array wird sortiert
        
        for(int i = 0; i < array.length - 1; i++) 
            
            for(int a = i + 1; a < array.length; a++) 
                
                if(array[i] > array[a]) 
                    
                    int temporaer = array[i];
                    array[i] = array[a];
                    array[a] = temporaer;
                    break;
                    
                
                
            
                    
        
        
    

你们能帮帮我吗?

【问题讨论】:

【参考方案1】:

选择排序应该通过在外部循环的第 i 次迭代中找到第 i 个最小的元素,然后将该元素交换到位置 i 来工作。在外循环完成迭代 i 之后,整个数组应该从位置 0 排序到 i。内部循环通过遍历数组的整个未排序部分并找到其中的最小元素来找到第 i 个最小元素。所以总的来说它应该是这样的:

    private static void selectionSort(int[] array)         //Array wird sortiert
        
        for(int i = 0; i < array.length - 1; i++) 
            // das Minimum finden
            int min = array[i];
            int minIdx = i;
            for(int a = i + 1; a < array.length; a++) 
                if(array[a] < min) 
                    min = array[a];
                    minIdx = a;  
                   
            
            // Austauschen
            int temp = array[i];
            array[i] = min;
            array[minIdx] = temp;          
         
    

如果没有 break 语句,您实际上仍将最小的元素放到位置 i,您只是不必执行如此多的交换即可。只需使用局部变量来跟踪 min 是什么/在哪里找到它,然后在最后进行一次交换。

【讨论】:

以上是关于选择排序,但每次迭代只有一个开关的主要内容,如果未能解决你的问题,请参考以下文章

为啥选择排序的复杂度不是 n 阶乘?

选择排序-Java实现

Day2:选择排序和两数相加

排序3-选择排序与归并排序(递归实现+非递归实现)

用JAVA实现选择排序

排序(选择插入希尔)