Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中数组的选择排序_C_Arrays - Fatal编程技术网

C语言中数组的选择排序

C语言中数组的选择排序,c,arrays,C,Arrays,我试图用C语言创建一个简单的(?)选择排序程序,它选择整数数组中最大的整数并将其放置在位置a[n-1],将第二大数字放置在[n-2]中,等等,直到最小的数字放置在[0]中。我已经在纸上运行了下面的代码,它看起来应该可以工作,但是当我编译它时,我得到了错误的结果。我错过了什么明显的东西吗 /* The program implements selection sort*/ #include <stdio.h> #include "simpio.h" #define n 5 voi

我试图用C语言创建一个简单的(?)选择排序程序,它选择整数数组中最大的整数并将其放置在位置a[n-1],将第二大数字放置在[n-2]中,等等,直到最小的数字放置在[0]中。我已经在纸上运行了下面的代码,它看起来应该可以工作,但是当我编译它时,我得到了错误的结果。我错过了什么明显的东西吗

/* The program implements selection sort*/

#include <stdio.h>
#include "simpio.h"

#define n 5

void GetArray(int a[]);
void SelectionSort(int a[]);
int FindMax(int a[], int high);
void swap(int a[], int p1, int p2);
void PrintArray(int a[]);

main()
{
      int a[n];
      GetArray(a);
      SelectionSort(a);
      PrintArray(a);
      getchar();
}

void GetArray(int a[])
{
     int i;
     for(i=0;i<n;i++)
     {
       printf("Enter integer# %d", i+1);
       a[i]=GetInteger();
     }
}

void SelectionSort(int a[])
{
     int i, max;
     for(i=0;i<n;i++)
     {
           max=FindMax(a,i);
           swap(a,max,(n-1-i));
     }     
}

int FindMax(int a[], int high)
{
    int i, index;
    index=high;
    for(i=high;i<n;i++)
    {
       if(a[i]>a[index])
          index=i;
    }
    return index;
}

void swap(int a[], int p1, int p2)
{
     int temp;
     temp=a[p2];
     a[p2]=a[p1];
     a[p1]=temp;
}

void PrintArray(int a[])
{
     int i;
     for(i=0;i<n;i++)
       printf("a[%d]=%d\n", i, a[i]);
}
/*程序实现选择排序*/
#包括
#包括“simpio.h”
#定义n5
void GetArray(inta[]);
void SelectionSort(int a[]);
int FindMax(int a[],int高);
无效掉期(整数a[],整数p1,整数p2);
void printary(int a[]);
main()
{
int a[n];
GetArray(a);
选择排序(a);
打印阵列(a);
getchar();
}
void GetArray(int a[])
{
int i;
对于(i=0;i不应:

       max=FindMax(a,i);
       swap(a,max,(n-1-i));
是:


否则,下次通过循环时,您将在数组的顶部位置找到相同的最大值。

将这些方法更改为:

void SelectionSort(int a[])
{
     int i, max;
     for(i=0;i<n;i++)
     {
           max=FindMax(a,n-i-1);
           swap(a,max,n-i-1);
     }     
}

int FindMax(int a[], int high)
{
    int i, index;
    index=high;
    for(i=0;i<high;i++)
    {
       if(a[i]>a[index])
          index=i;
    }
    return index;
}
void SelectionSort(int a[])
{
int i,max;

for(i=0;i选择排序的一个非常基本的实现

#include<stdio.h>
main()
{
       int i,j,n=7,a[]={1,2,5,3,8,9,5},key;
       for(j=1;j<n;j++)
       {
                       key=a[j];    //a[j] is the new element to be added to the sorted
                                    //sequence
                       i=j-1;       
                       while(i>=0 && key<a[i]) //traverse through the sorted sequence
                       {a[i+1]=a[i];i--;}      //until the place of key is found
                       a[i+1]=key;             
       }
       for (j=0;j<n;j++)
       printf("%d",a[j]);
}
#包括
main()
{
int i,j,n=7,a[]={1,2,5,3,8,9,5},键;
对于(j=1;j=0&&key
#包括
#包括
int removex(int arr[],int small,int n)
{
int i=0;

对于(;i选择排序是从列表中比较最小元素并从最小索引中放置的过程。 现在考虑下面的代码片段。

public void selectionSort(int[] elements) {
    
    for(int i=0;i<elements.length;i++) {
        int minPosition = i;
        for(int j=i+1;j<elements.length;j++) {              
            if(elements[minPosition]>elements[j])
                minPosition = j;                
        }

        int temp = elements[i];
        elements[i] = elements[minPosition];
        elements[minPosition] = temp;       
    }
}
public void selectionSort(int[]元素){

对于(int i=0;我不会在纸上尝试,通过调试器运行它,直到你发现它的行为偏离你的预期。我同意奥利的观点-而且,如果你能缩小问题的范围,你通常会从这里的问题中得到更好的回答。调试器或打印语句将帮助你做到这一点-你甚至可以找到专业的无需提问的问题:)“我得到了错误的结果。”什么输入产生了什么结果?给出示例输入,并展示您实际得到的结果。这就是为什么您应该咬紧牙关,学习如何使用
qsort
:-)@TimothyJones,你能澄清一下你所说的打印语句是什么意思吗?我还没有真正调试过这个方法,我也不太确定我是否能看到它在这里的应用…(很抱歉,如果这有一个明显的答案,我对编程有点陌生)。但是,最高的数字不是应该放在[0]中吗,等等?没错。您当前的版本使用SelectionSort进行降级排序,但使用FindMax进行升序排序。Daniel的回答为您修复了FindMax。离题,但您是否来自PhpBB支持论坛?我想我认识您:-)但这似乎对我有用,我必须看看我以前的代码,看看哪里出了问题。没有-甚至从来没有做过任何真正的PHP。但很高兴我能帮上忙:)请解释。为什么要为一个已经有了公认答案的4年问题添加另一个答案?特别是如果你的新答案只是一堆没有解释的代码。
不是标准标题;
void main
应该是
int main
clrsc
getch
不是标准函数;你应该永远不要忽略
scanf
的返回值(实际上,您不应该首先将
scanf
用于用户输入);这也是一种潜在的缓冲区溢出。@melpomene谢谢您的反馈,先生
#include<stdio.h>
#include<conio.h>
int removex(int arr[],int small,int n)
{
    int i=0;
    for(;i<n;i++)
        if(arr[i]==small)  //searching that no to delete
            break;
    for(;i<n-1;i++)
        arr[i]=arr[i+1]; //delete by overloading no
    return n-1;
}
void selectSort(int arr[],int sort[],int n)
{
    int j=0,k=0,small;
    while(n!=0)
    {
        small=arr[0];
        for(j=0;j<n;j++)
            if(arr[j]<small)
                small=arr[j]; //finding smallest no
        sort[k++]=small;
        n=removex(arr,small,n);  //removing that from list as we included that no into sorted list
    }
}
void main()
{
    int arr[10],arr2[10],i,n;
    clrscr();
    printf("Enter how many elements");
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&arr[i]);
    selectSort(arr,arr2,n);
    printf("sorted list is\n");
    for(i=0;i<n;i++)
        printf("%d\n",arr2[i]);

    getch();
}
public void selectionSort(int[] elements) {
    
    for(int i=0;i<elements.length;i++) {
        int minPosition = i;
        for(int j=i+1;j<elements.length;j++) {              
            if(elements[minPosition]>elements[j])
                minPosition = j;                
        }

        int temp = elements[i];
        elements[i] = elements[minPosition];
        elements[minPosition] = temp;       
    }
}