C中数组的选择排序

时间:2012-02-22 01:33:20

标签: c arrays

我正在尝试在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]);
}

5 个答案:

答案 0 :(得分:1)

将这些方法更改为:

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;
}

我实际上测试了我的答案,但它确实有效。

答案 1 :(得分:1)

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

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;       
    }
}

感谢您的阅读,让我知道反馈可以改善我的生活

答案 2 :(得分:0)

不应:

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

是:

       max=FindMax(a,i);
       swap(a,max,i);

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

答案 3 :(得分:0)

选择排序的一个非常基本的实现

#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]);
}

答案 4 :(得分:-1)

#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();
}