user-0 提问: 对于选择排序的疑惑

回复:
user: user-1
content: 引用 18 楼 余良龙-3 的回复：这样不是更简单？  #include <iostream>  using namespace std;  void Selectsort(int a[],int n) { 	int i,j,temp; 	for( i=0;i<n;i++) 	{ 	  for(j=i+1;j<n;j++) 	  { 	  	if(a[i]>a[j]) 	  	{ 	  		temp = a[i]; 	  		a[i] = a[j]; 	  		a[j] = temp;  	     } 	  }	 	} }   int main()  {  	int a[]={5,2,2,6,4};  	int i;  	Selectsort(a,5);   	for(i=0;i<5;i++) 	 { 	 	cout<<a[i]<<" "; 	 }  	return 0;  }这叫冒泡排序。

user: user-2
content: 这样不是更简单？  #include <iostream>  using namespace std;  void Selectsort(int a[],int n) { 	int i,j,temp; 	for( i=0;i<n;i++) 	{ 	  for(j=i+1;j<n;j++) 	  { 	  	if(a[i]>a[j]) 	  	{ 	  		temp = a[i]; 	  		a[i] = a[j]; 	  		a[j] = temp;  	     } 	  }	 	} }   int main()  {  	int a[]={5,2,2,6,4};  	int i;  	Selectsort(a,5);   	for(i=0;i<5;i++) 	 { 	 	cout<<a[i]<<" "; 	 }  	return 0;  }

user: user-0
content: 引用 16 楼 自信男孩的回复:[quote=引用 14 楼 白云牛奶糖 的回复:] [quote=引用 12 楼 自信男孩 的回复:] #include <stdio.h> #include <stdlib.h>  void selectsort(int a[],int n) {     int min,i,j,temp;     for(i=0;i<n-1;i++)     {         min=i;         for(j=i+1;j<n;j++) {             if(a[min]>a[j])                 min=j;         }         if(min!=i)         {             temp=a[i];             a[i]=a[min];             a[min]=temp;         }     } }  int main() {     int a[ ]={6,3,2,5,4},i;     selectsort(a,5);     for(i=0;i<5;i++)     {         printf("%5d",a[i]);     }       return 0; } 供参考～  选择排序有点问题，交换的代码块要放在二层循环外，而不是里面。谢谢大佬，您能略微解释一下吗，放在里面和放在外面的差距在哪呢。[/quote]  应该放在外面，因为内存循环用于找到剩下的最大值/最小值（根据是升序还是降序来决定），所以找到之后在考虑是否交换，如果放在第二层循环内，那么交换的时候就不确定是不是已经找到最大值/最小值，因为此时还没有循环结束。[/quote] 哦谢谢大佬懂了懂了，谢谢您。

user: user-3
content: 引用 14 楼 白云牛奶糖 的回复:[quote=引用 12 楼 自信男孩 的回复:] #include <stdio.h> #include <stdlib.h>  void selectsort(int a[],int n) {     int min,i,j,temp;     for(i=0;i<n-1;i++)     {         min=i;         for(j=i+1;j<n;j++) {             if(a[min]>a[j])                 min=j;         }         if(min!=i)         {             temp=a[i];             a[i]=a[min];             a[min]=temp;         }     } }  int main() {     int a[ ]={6,3,2,5,4},i;     selectsort(a,5);     for(i=0;i<5;i++)     {         printf("%5d",a[i]);     }       return 0; } 供参考～  选择排序有点问题，交换的代码块要放在二层循环外，而不是里面。谢谢大佬，您能略微解释一下吗，放在里面和放在外面的差距在哪呢。[/quote]  应该放在外面，因为内存循环用于找到剩下的最大值/最小值（根据是升序还是降序来决定），所以找到之后在考虑是否交换，如果放在第二层循环内，那么交换的时候就不确定是不是已经找到最大值/最小值，因为此时还没有循环结束。

user: user-0
content: 引用 13 楼 kuangbao9 的回复:内层循环也需要。不然只要一次进来的，后面的都会进来。你可以调试跟踪一下就知道了嗯嗯好的谢谢大佬

user: user-0
content: 引用 12 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  void selectsort(int a[],int n) {     int min,i,j,temp;     for(i=0;i<n-1;i++)     {         min=i;         for(j=i+1;j<n;j++) {             if(a[min]>a[j])                 min=j;         }         if(min!=i)         {             temp=a[i];             a[i]=a[min];             a[min]=temp;         }     } }  int main() {     int a[ ]={6,3,2,5,4},i;     selectsort(a,5);     for(i=0;i<5;i++)     {         printf("%5d",a[i]);     }       return 0; } 供参考～  选择排序有点问题，交换的代码块要放在二层循环外，而不是里面。谢谢大佬，您能略微解释一下吗，放在里面和放在外面的差距在哪呢。

user: user-4
content: 内层循环也需要。不然只要一次进来的，后面的都会进来。你可以调试跟踪一下就知道了

user: user-3
content: #include <stdio.h> #include <stdlib.h>  void selectsort(int a[],int n) {     int min,i,j,temp;     for(i=0;i<n-1;i++)     {         min=i;         for(j=i+1;j<n;j++) {             if(a[min]>a[j])                 min=j;         }         if(min!=i)         {             temp=a[i];             a[i]=a[min];             a[min]=temp;         }     } }  int main() {     int a[ ]={6,3,2,5,4},i;     selectsort(a,5);     for(i=0;i<5;i++)     {         printf("%5d",a[i]);     }       return 0; } 供参考～  选择排序有点问题，交换的代码块要放在二层循环外，而不是里面。

user: user-0
content: 引用 8 楼 kuangbao9 的回复:是min = i;诶大佬这样好像可以了。您能解释一下吗，我感觉您加上去的语句是多余的但又是有用的，因为外面循环已经重新定义了。

user: user-0
content: 引用 9 楼 @矛盾综合体的回复:[quote=引用 6 楼 白云牛奶糖 的回复:] [quote=引用 5 楼 @矛盾综合体的回复:] #include <stdio.h> #include <stdlib.h>  void selectsort(int a[],int n) {     int min,i,j,temp;     for(i=0;i<n-1;i++)    {         min=i;         for(j=i+1;j<n;j++)         {             if(a[min]>a[j])             min=j;              if(min!=i)             {             	temp=a[i];             	a[i]=a[min];             	a[min]=temp; 			}          }     } }  int main() {     int a[ ]={4,3,2,5,6},i;     selectsort(a,5);     for(i=0;i<5;i++)     {         printf("%5d",a[i]);     } 	printf("\n");      return 0; }   没有吧 不能连续回3次。。然后另一张图片只能私信。。[/quote] 如有其它，请私信 [/quote] 大佬您设置了不能私信

user: user-5
content: 引用 6 楼 白云牛奶糖 的回复:[quote=引用 5 楼 @矛盾综合体的回复:] #include <stdio.h> #include <stdlib.h>  void selectsort(int a[],int n) {     int min,i,j,temp;     for(i=0;i<n-1;i++)    {         min=i;         for(j=i+1;j<n;j++)         {             if(a[min]>a[j])             min=j;              if(min!=i)             {             	temp=a[i];             	a[i]=a[min];             	a[min]=temp; 			}          }     } }  int main() {     int a[ ]={4,3,2,5,6},i;     selectsort(a,5);     for(i=0;i<5;i++)     {         printf("%5d",a[i]);     } 	printf("\n");      return 0; }   没有吧 不能连续回3次。。然后另一张图片只能私信。。[/quote] 如有其它，请私信

user: user-4
content: 是min = i;

user: user-4
content: if(min!=i)             {                 temp=a[i];                 a[i]=a[min];                 a[min]=temp;                m=i;             }  加个这个试试

user: user-0
content: 引用 5 楼 @矛盾综合体的回复: #include <stdio.h> #include <stdlib.h>  void selectsort(int a[],int n) {     int min,i,j,temp;     for(i=0;i<n-1;i++)    {         min=i;         for(j=i+1;j<n;j++)         {             if(a[min]>a[j])             min=j;              if(min!=i)             {             	temp=a[i];             	a[i]=a[min];             	a[min]=temp; 			}          }     } }  int main() {     int a[ ]={4,3,2,5,6},i;     selectsort(a,5);     for(i=0;i<5;i++)     {         printf("%5d",a[i]);     } 	printf("\n");      return 0; }   没有吧 不能连续回3次。。然后另一张图片只能私信。。

user: user-5
content: #include <stdio.h> #include <stdlib.h>  void selectsort(int a[],int n) {     int min,i,j,temp;     for(i=0;i<n-1;i++)    {         min=i;         for(j=i+1;j<n;j++)         {             if(a[min]>a[j])             min=j;              if(min!=i)             {             	temp=a[i];             	a[i]=a[min];             	a[min]=temp; 			}          }     } }  int main() {     int a[ ]={4,3,2,5,6},i;     selectsort(a,5);     for(i=0;i<5;i++)     {         printf("%5d",a[i]);     } 	printf("\n");      return 0; }   没有吧

user: user-0

user: user-0
content: 引用 1 楼 kuangbao9的回复:可是为啥我的每次都可以呢？ 为啥我电脑不行，等等啊，我发图片上去

user: user-4
content: 可是为啥我的每次都可以呢？