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