zhugenmi 2021-05-21 20:52 采纳率: 100%
浏览 34
已结题

我这选择排序哪里出问题了

代码如下,

int main()
{
    int* pi=new int[30];
    for (int i = 0; i < 30; i++)
    {
        *(pi + i) = rand() % 700 + 200;
    }
    for (int i = 0; i < 29; i++)
    {
        int k = i;
        for (int j = i + 1; j < 30; j++)
        {
            if (*(pi+k) > *(pi+j)) k = j;
            if (k != i)
            {
                int temp = *(pi + k); *(pi + k) = *(pi + j); *(pi + j) = temp;
            }
        }
    }
    for (int i = 0; i < 30; i++)
        cout << *(pi + i) << " \t ";
    delete[] pi;
    
    return 0;
}

输出结果:241      467     800     524     858     864     562     691     827     804     821     736     716     682     602    495      492     478     469     395     391     381     361     353     345     318     305     242     234     227 

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2021-05-21 21:04
    关注

    有两点错误,主要是if(k!=i)这个判断处理,一是要放到第一层循环内,二是交换数据是pi+k和pi+i对应数据交换,不是pi+j

    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    int main()
    {
        int* pi=new int[30];
    	int i,j;
        for (i = 0; i < 30; i++)
        {
            *(pi + i) = rand() % 700 + 200;
        }
        for (i = 0; i < 29; i++)
        {
            int k = i;
            for (j = i + 1; j < 30; j++)
            {
                if (*(pi+k) > *(pi+j)) 
    				k = j;
            
            }
    		if (k != i)
    		{
    			int temp = *(pi + k); 
    			*(pi + k) = *(pi + i); 
    			*(pi + i) = temp;
    		}
        }
        for (i = 0; i < 30; i++)
            cout << *(pi + i) << " \t ";
        delete[] pi;
        
    
        return 0;
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?