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

代码如下,

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 

有两点错误,主要是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;
}

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632