C 选择排序算法能否像冒泡排序那样提前结束循环?

C 选择排序算法能否像冒泡排序那样提前结束循环?,c,flags,selection-sort,C,Flags,Selection Sort,如果我不包含提前终止标志,这个程序将运行良好,但它只需要10次排序就可以对列表进行完全排序,而不是12次排序。但是,当包含终止标志时,它会过早终止排序。按照逻辑,我可以看到这是因为在第三次传递之后,数组的顺序如下: 由于索引i当前为7,因此没有较小的值可交换,因此该标志没有得到分配给它的值1,循环终止。所以我想我的问题是,是否有可能提前打破选择排序算法,并且仍然完全完成排序 #include<stdio.h> int main() { int list[13]= {23,

如果我不包含提前终止标志,这个程序将运行良好,但它只需要10次排序就可以对列表进行完全排序,而不是12次排序。但是,当包含终止标志时,它会过早终止排序。按照逻辑,我可以看到这是因为在第三次传递之后,数组的顺序如下:

由于索引i当前为7,因此没有较小的值可交换,因此该标志没有得到分配给它的值1,循环终止。所以我想我的问题是,是否有可能提前打破选择排序算法,并且仍然完全完成排序

#include<stdio.h>
int main()
{
     int list[13]= {23,8,4,7,22,18,39,42,5,88,16,11,3};
     int temp,min,flag;
     printf( "Before Sorting\n" );
     printf( "23 8 4 7 22 18 39 42 5 88 16 11 3\n" );

for( int i=0; i<12; i++ )
    {
        flag = 0;
        min = i;

        for( int j=i+1; j<13; j++ )
            {
                if( list[j]<list[min] )
                    {
                        flag = 1;
                        min = j  ;
                    }
            }

        if( !flag )
            break;

        temp = list[i];
        list[i]=list[min];
        list[min]=temp;

        printf( "\nAfter Pass %d.\n",i+1 );
        for( int i=0; i<13; i++ )
            printf( "%d ",list[i] );

        printf( "\n" );
    }

return 0;
}
#包括
int main()
{
int list[13]={23,8,4,7,22,18,39,42,5,88,16,11,3};
内部温度,最小值,标志;
printf(“排序前”);
printf(“238472218394258816113\n”);

对于(inti=0;i,冒泡排序几乎没有什么可取之处,它最好的地方是它的名字

泡沫排序似乎没有什么值得推荐的,除了一个吸引人的名字和它导致一些有趣的理论问题的事实

事实上,从维基百科上可以看到:

在简单平均caseΘ(n²)算法中,选择排序几乎总是优于冒泡排序和gnome排序


选择排序没有变化——它的运行时间不依赖于排序。对于另一个运行时间可变的简单O(n²)算法,请参见。

气泡排序几乎没有什么可取之处,最妙的是它的名称。Donald Knuth说过

泡沫排序似乎没有什么值得推荐的,除了一个吸引人的名字和它导致一些有趣的理论问题的事实

事实上,从维基百科上可以看到:

在简单平均caseΘ(n²)算法中,选择排序几乎总是优于冒泡排序和gnome排序


选择排序没有变化-其运行时间不依赖于排序。有关另一个运行时间可变的简单O(n²)算法,请参阅。

确实可以。下面是这样一个实现

int selsort(int v[], int n){

  bool sorted = false; // v not known to be sorted
  int  i = 0;          // i smallest elements in place 

  while(!sorted){
    // find min v[i..n-1]
    // check if v[i..n-1] is sorted

    int  j   = i+1;
    int  min = i;    // position of minimum of v[i..j-1]
    sorted   = true; // v[i..j-1] sorted

    while(j<n){
      if(v[j]<v[min]) min = j;        // update min
      if(v[j]<v[j-1]) sorted = false; // update sorted
      j++;
    }

    if (!sorted){
      // place min v[i..n-1] in v[i]
      int aux = v[i];
      v[i]    = v[min];
      v[min]  = aux;      

      i++;
    }
  }

  return EXIT_SUCCESS;
}

只要您不必更新内部循环中的最小值,您的标志将保持在
0
。因此,第一个位置具有最小值的任何段都将被视为已排序。

确实可以。下面是这样一个实现

int selsort(int v[], int n){

  bool sorted = false; // v not known to be sorted
  int  i = 0;          // i smallest elements in place 

  while(!sorted){
    // find min v[i..n-1]
    // check if v[i..n-1] is sorted

    int  j   = i+1;
    int  min = i;    // position of minimum of v[i..j-1]
    sorted   = true; // v[i..j-1] sorted

    while(j<n){
      if(v[j]<v[min]) min = j;        // update min
      if(v[j]<v[j-1]) sorted = false; // update sorted
      j++;
    }

    if (!sorted){
      // place min v[i..n-1] in v[i]
      int aux = v[i];
      v[i]    = v[min];
      v[min]  = aux;      

      i++;
    }
  }

  return EXIT_SUCCESS;
}

只要您不必更新内部循环中的最小值,您的标志将保持在
0
。因此,第一个位置具有最小值的任何段都将被视为已排序。

您不能像这样中断。这里,当前值7是列表中的最小值,因此它是(应该)的不与任何内容交换,但这并没有说明剩余文件的任何内容(除非所有值都已知为>=7)。与其尝试优化选择排序,不如使用时间复杂度更高的智能排序算法。在选择排序中,您唯一可以跳过的是交换。您不能这样中断。此处,当前值7是列表中的最低值,因此它(应该)是这样的不与任何内容交换,但这并不能说明剩余文件的任何内容(除非已知所有值均大于等于7)。与其尝试优化选择排序,不如使用时间复杂度更高的智能排序算法。在选择排序中,唯一可以跳过的是交换。