2201_75843485 2024-02-27 21:31 采纳率: 50%
浏览 3
已结题

C语言 选择排序算法 代码逻辑问题


//交换两个数据
void Swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

//选择排序
void SelectSort(int* arr, int size)
{
    int i = 0;
    for (i = 0; i < size-1; i++)
    {
        int min = i;
        int j = 0;
        for (j = i+1; j < size; j++)
        {
            if (arr[j] < arr[min])
            {
                min = j;
            }
        }
        Swap(&arr[i], &arr[min]);
    }
}

上面这是选择排序的代码
假设这个数组三个值为1,2,3
i=0的时候,通过这个代码遍历第一遍,可以找出min=0,
然后回到代码int min=i?这个时候i++ 了,也就是说此时i=1,所以min=1?


选择排序此刻的意义应该是找出最小值后与第一个数值进行交换,但我不理解此刻代码是怎么实现的

  • 写回答

5条回答 默认 最新

  • a5156520 2024-02-28 11:02
    关注

    代码中的选择排序是通过遍历数组第一个元素到倒数第二个元素的下标,然后逐个将前面的元素与后面的元素比较,找出较小的值后,将其与前面的值交换, 以达到从小到大排序的目的。

    测试如下:

    #include <stdio.h>
    #define N 4
     
    //交换两个数据
    void Swap(int* a, int* b)
    {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
     
     // https://blog.csdn.net/weixin_52811588/article/details/126486829
    //选择排序,将数组元素从小到大排序 
    void SelectSort(int* arr, int size)
    {
        int i = 0;
        for (i = 0; i < size-1; i++) // 遍历第一个元素到倒数第二个数组元素之间的所有元素下标 
        {
            int min = i;  // 将最小值的下标默认为当前下标i 
            int j = 0;     
            for (j = i+1; j < size; j++)  // 遍历当前下标i后一个元素后面所有元素下标 
            {
                if (arr[j] < arr[min])  // 如果后面的元素比最小值下标中的元素小,则将当前最小值与后面的元素值 
                {
                    min = j;
                }
            }
            Swap(&arr[i], &arr[min]);  // 交换当前下标i的元素与最小值元素的值,以达到从小到排序数组的目的
            printf("\n排序第%d次:",i+1);
            for(int k=0;k<N;k++){
                printf("%d ",arr[k]);
            }
            printf("\n");
             
        }
    }
     
     
    int main(void){
        
        int i;
        int arr[N]={4,3,2,1};
        
        printf("排序数组前,数组元素为:\n");
        for(i=0;i<N;i++){
            printf("%d ",arr[i]);
        }
        
        SelectSort(arr,N);
        
        printf("\n排序数组后,数组元素为:\n");
        for(i=0;i<N;i++){
            printf("%d ",arr[i]);
        }
        
    } 
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 已采纳回答 2月28日
  • 创建了问题 2月27日

悬赏问题

  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥20 spring boot集成mqtt的使用问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错