我正在尝试在C中创建一个简单的程序来实现Selection Sort。
以下是我的计划:
#include<stdio.h>
#include<conio.h>
int main(void)
{
int min, total, *arr,i,j,temp;
clrscr();
printf("Enter the size of array : ");
scanf("%d",&total);
arr = (int *) malloc(total * sizeof(int));
for(i = 0; i<total; i++)
{
printf("\nEnter element %d: ", i+1);
scanf("%d", &arr[i]);
}
min = arr[0];
for(i = 0; i<total; i++)
{
for(j = i; j<total; j++)
{
if(arr[j]<min)
{ min=arr[j]; }
}
min = temp;
min = arr[i];
arr[i] = min;
}
for(i = 0; i<total; i++)
{
printf("%d \t", arr[i]);
}
getch();
return 0;
}
输出:
答案应该是
10 20 30 40 70 80
如何修复程序?
编辑1:
阅读cnicutar的回答后修正了临时问题
min = arr[0];
for(i = 0; i<total; i++)
{
for(j = i; j<total; j++)
{
if(arr[j]<min)
{
min=arr[j];
min_index = j;
}
}
temp = a[i];
a[i] = min;
a[min_index] = temp;
}
现在,我得到上述输入值:10 10 10 20 10 10
编辑2:
发现问题,该程序对所有迭代使用相同的最小值
#include<stdio.h>
#include<conio.h>
int main(void)
{
int min, min_index, total, *arr,i,j,temp;
clrscr();
printf("Enter the size of array : ");
scanf("%d",&total);
arr = (int *) malloc(total * sizeof(int));
for(i = 0; i<total; i++)
{
printf("\nEnter element %d: ", i+1);
scanf("%d", &arr[i]);
}
min = arr[0]; // min = arr[0] = 70 || min = 10 <-- Problem
for(i = 0; i<total-1; i++) // i = 0 ||
{ // ||
for(j = i; j<total; j++) // j = i = 0 ||
{ // ||
if(arr[j]<min) // 30<70 ; 40<30 ; 10<30 ||
{ // ||
min=arr[j]; // min = 30 ; ; min = 10 ||
min_index = j; // index = 1 ; ; index = 3 ||
} // ||
} // ||
// ||
if(min!=arr[i]) // ||
{ // ||
temp = arr[i]; // ||
arr[i] = min; // ||
arr[min_index] = temp; // After swap: 10 30 40 70 80 20 ||
}
min = arr[i+1]; // (Add this to fix the problem)
}
for(i = 0; i<total; i++)
{
printf("%d \t", arr[i]);
}
getch();
return 0;
}
答案 0 :(得分:2)
至少有两个问题:你的“交换”错了:
min = temp; min = arr[i]; arr[i] = min;
你应该记住最小元素的索引,改变min
不会。具体来说:您想要更改arr[mystery]
中mystery = j
的{{1}}。
答案 1 :(得分:0)
不应该是
for(j = i+1; j<total; j++)
{
没有i + 1,你正在迭代你已经排序过的值。