user-0 提问: 一个排序程序的小问题。排序结果为什么有时候不对，有时又是对的，

回复:
user: user-1
content: #include <stdio.h>   void swap(int *a, int *b) {     int c;     c = *a;     *a = *b;     *b = c; } int main() {     int a[10];     int max, maxno;     int i, j;     printf("\n请输入10个正整数：");     for (i = 0; i < 10; i++)         scanf_s("%d", &a[i]);      for (i = 0; i < 10; i++)  //遍历数组的10个值     {         //max = a[i];   //把最大值 放在 max中         maxno = i;     //把最大值的下标放在 序号中         for (j = i + 1; j < 10; j++)         {             //if (max < a[j])     //如果数组的其它值大于最大值             if (a[maxno] < a[j])     //如果数组的其它值大于最大值             {                 //max = a[j];   //记住最大值                 maxno = j;    //记住最大值下樯             }         }         if (i != maxno)    //如果 最大值 下标不等于当前下标             swap(&a[i], &a[maxno]);   //交换最大值 与当前值         printf("%d\t", a[i]);     }     printf("\n"); }  供参考！  max可以不用的。

user: user-0
content: 引用 6 楼 636f6c696e的回复:虽然你这么写结果是对的，但还是多了很多次无效的比较，你的算法核心是每次找到剩余数中最大的数放到第一个。 那为什么要交换那么多次呢？每次循环交换一个最大的不就成了？ [quote=引用 5 楼 UIUI 的回复:] [quote=引用 3 楼 user-3的回复:]交换应该放在第二个循环外，第一个循环内。  选择排序，是找到子序列的最大值，然后再与第一个元素交换。 我最后贴的也是对的，能正确输出[/quote][/quote] 多谢，放到外面是对的，确实能减少交换次数。

user: user-2
content: 虽然你这么写结果是对的，但还是多了很多次无效的比较，你的算法核心是每次找到剩余数中最大的数放到第一个。 那为什么要交换那么多次呢？每次循环交换一个最大的不就成了？ 引用 5 楼 UIUI 的回复:[quote=引用 3 楼 user-3的回复:]交换应该放在第二个循环外，第一个循环内。  选择排序，是找到子序列的最大值，然后再与第一个元素交换。 我最后贴的也是对的，能正确输出[/quote]

user: user-0
content: 引用 3 楼 user-3的回复:交换应该放在第二个循环外，第一个循环内。  选择排序，是找到子序列的最大值，然后再与第一个元素交换。 我最后贴的也是对的，能正确输出

user: user-2
content: 逻辑错了，交换一次后maxno和i就不同了，所以后面每次j的循环都会进行交换，应该把交换放在第二个for循环外： int a[10];     int max, maxno;     int i, j;     printf("\n请输入10个正整数：");     for (i = 0; i < 10; i++)         scanf("%d", &a[i]);      for (i = 0; i < 10; i++)  //遍历数组的10个值     {         max = a[i];   //把最大值 放在 max中         maxno = i;     //把最大值的下标放在 序号中         for (j = i + 1; j < 10; j++)         {             if (max < a[j])     //如果数组的其它值大于最大值              {                 max = a[j];   //记住最大值                  maxno = j;    //记住最大值下樯             }         } if (i != maxno)    //如果 最大值 下标不等于当前下标                 swap(&a[i], &a[maxno]);   //交换最大值 与当前值         printf("%d\t", a[i]);     }     printf("\n");

user: user-3
content: 交换应该放在第二个循环外，第一个循环内。  选择排序，是找到子序列的最大值，然后再与第一个元素交换。

user: user-0
content: for (i = 0; i < 10; i++)  //遍历数组的10个值     {         max = a[i];   //把最大值 放在 max中         maxno = i;     //把最大值的下标放在 序号中         for (j = i + 1; j < 10; j++)         {             if (max < a[j])     //如果数组的其它值大于最大值              {                 max = a[j];   //记住最大值                  maxno = j;    //记住最大值下樯                          if (i != maxno)    //如果 最大值 下标不等于当前下标    是因为上面有交换，这里才能交换。。。没有交换，则不能交换，不能 //放到比较条件外，  调试工具真是好用。比较容易找到问题                 swap(&a[i], &a[maxno]);   //交换最大值 与当前值             }         }         printf("%d\t", a[i]);     }

user: user-0
content: void swap(int *a, int *b)  { 	int c; 	c = *a; 	*a = *b; 	*b = c; } main() { 	int a[10]; 	int max, maxno; 	int i, j; 	printf("\n请输入10个正整数："); 	for (i = 0; i < 10; i++) 		scanf_s("%d", &a[i]);  	for (i = 0; i < 10; i++)  //遍历数组的10个值 	{ 		max = a[i];   //把最大值 放在 max中 		maxno = i;     //把最大值的下标放在 序号中 		for (j = i + 1; j < 10; j++) 		{ 			if (max < a[j])     //如果数组的其它值大于最大值  			{ 				max = a[j];   //记住最大值  				maxno = j;    //记住最大值下樯 			} 			if (i != maxno)    //如果 最大值 下标不等于当前下标 				swap(&a[i], &a[maxno]);   //交换最大值 与当前值 		} 		printf("%d\t", a[i]); 	} 	printf("\n"); }