问题描述
#include <stdio.h>
int size;
void SelectionSort(int a[],int size) {
int i,j,t,min,b[] = { 0,0 };
printf("\nelements to sort : ");
for (t = 0; t < size; t++) printf("%d ",a[t]);
printf("\n\n<<<<<<<<<<<<<<<<< selection sort >>>>>>>>>>>>\n");
for (i = 0; i < size - 1; i++) {
min = i;
for (j = i + 1; j < size; j++) {
if (a[j] < a[min]) min = j;
}
b[i] = a[min];
printf("\nA ARRAY %d : ",i + 1);
for (t = 0; t < size; t++) printf("%3d",a[t]);
printf("\nB ARRAY %d : ",b[t]);
}
}
void main() {
int list[8] = { 69,10,30,2,16,8,31,22 };
size = 8;
SelectionSort(list,size);
getchar();
}
问题在于,每完成一次比较,数字2就会复制到数组中 我该怎么做才能解决此问题?
解决方法
选择排序的每个步骤都需要
- 确定子数组中的最小元素
- 删除元素
- 将其放在前面
您的代码正在跳过步骤2。因此,它会一直查找2
,直到i
超过它为止。
与其复制到另一个数组b
中,不如将最低的元素替换为a[i]
。
t = a[min];
a[min] = a[i];
a[i] = t;
顺便说一句,在此类问题中向我们显示输出将很有帮助,这样潜在的应答者就无需自己编译和运行程序。
,这是对常规选择类型的修改,其中考虑了重复项。
在每个内部循环中,将读取整个数组。仅考虑大于前一个最小值(lmin
)的值,并计算等于当前接受的最小值(min
)的值(nmin
为计数)。然后,使用等于b
的{{1}}值更新数组nmin
。第一个循环是一个特例,因为没有前面的最小值。
min
布尔值#include <stdio.h>
void selection_sort(int n,int a[n],int b[n]) {
int j,k,lmin,min,nmin,first;
min = a[0];
nmin = 1;
for (j = 1; j < n; j++) {
if (a[j] == min) {
nmin++;
} else if (a[j] < min) {
min = a[j];
nmin = 1;
}
}
for (k = 0; nmin > 0; nmin--) {
b[k++] = min;
}
while (k < n) {
lmin = min;
first = 1;
for (j = 0; j < n; j++) {
if (a[j] > lmin) {
if (first) {
first = 0;
min = a[j];
nmin = 1;
} else if (a[j] == min) {
nmin++;
} else if (a[j] < min) {
min = a[j];
nmin = 1;
}
}
}
for ( ; nmin > 0; nmin--) {
b[k++] = min;
}
}
}
#define N 20
int main(void) {
int a[] = {2,5,9,8,4,7,1,3,6,2,8};
int b[N];
selection_sort(N,a,b);
for (int i = 0; i < N; i++) {
printf("%d ",a[i]);
}
printf("\n");
for (int i = 0; i < N; i++) {
printf("%d ",b[i]);
}
printf("\n");
return 0;
}
的目的是检测第一个接受的电流最小值(即,大于first
的第一个值)。
另一种方法是在内部循环开始之前设置lmin
,其中min = INT_MAX
是最大INT_MAX
值(在int
中定义):我们知道{ {1}},否则我们将已经退出该函数。这是此变体:
limits.h
请注意,在此版本中,lmin < INT_MAX
在内部循环之前设置为零:值小于#include <stdio.h>
#include <limits.h>
void selection_sort(int n,nmin;
min = a[0];
nmin = 1;
for (j = 1; j < n; j++) {
if (a[j] == min) {
nmin++;
} else if (a[j] < min) {
min = a[j];
nmin = 1;
}
}
for (k = 0; nmin > 0; nmin--) {
b[k++] = min;
}
while (k < n) {
lmin = min;
min = INT_MAX;
nmin = 0;
for (j = 0; j < n; j++) {
if (a[j] > lmin) {
if (a[j] < min) {
min = a[j];
nmin = 1;
} else if (a[j] == min) {
nmin++;
}
}
}
for ( ; nmin > 0; nmin--) {
b[k++] = min;
}
}
}
#define N 20
int main(void) {
int a[] = {2,b[i]);
}
printf("\n");
return 0;
}
并不重要。但是,如果所有剩余值都等于nmin
,我们将使用INT_MAX
对其进行计数,因此我们必须从零开始。