c - C中的指针数组排序有意外的输出
问题描述
#include <stdio.h>
void sort(int *ptr, int n) {
int i,j,tmp;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (ptr[i] < ptr[j])
{
tmp=ptr[i];
ptr[i]=ptr[j];
ptr[j]=tmp;
}
}
int main() {
int i,n;
int *ptr;
printf("Nr. of elements : 5 \n");
n=5;
ptr=(int*)malloc( n * sizeof(int));
for (i=0;i<n;i++) {
scanf("%d",&ptr[i]);
}
printf("Initial array is : ");
for (i=0;i<n;i++) {
printf("%d ",ptr[i]);
}
sort(ptr,n);
printf("Sorted array is : ");
for (i=0;i<n;i++) {
printf("%d ",ptr[i]);
}
return 0;
}
这是我的代码。我正在尝试使用函数对指针数组进行排序。无论 (int) 输入是什么,它都能很好地解决。我的困惑是我正在使用
ptr[i] < ptr[j]
而不是
ptr[i] > ptr[j]
通常应该对它进行升序排序。这是为什么?
解决方案
鉴于您的循环从i = 0 .. n
and开始j = 0 .. n
,您的代码无法保证i < j
.
有两种方法可以解决这个问题:
void sort(int *ptr, int n) {
int i,j,tmp;
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
if (i < j && ptr[i] < ptr[j]) { // Note the changed conditional
tmp=ptr[i];
ptr[i]=ptr[j];
ptr[j]=tmp;
}
}
}
}
或者
void sort(int *ptr, int n) {
int i,j,tmp;
for (i=0; i<n; i++) {
for (j=i+1; j<n; j++) { // Note the changed start value
if (ptr[i] < ptr[j]) {
tmp=ptr[i];
ptr[i]=ptr[j];
ptr[j]=tmp;
}
}
}
}
推荐阅读
- c# - 如何在 Unity C# 中延迟为玩家添加更多生命值?
- c - 我不明白 inih 是如何工作的
- wxpython - 在 wxPython 中使用 wxFileConfig 时如何捕获文件未找到类型错误?
- r - 如何将(半)监督方法(结构主题模型,种子 lda)应用于只有一个主题的语料库,并在 r 中每年汇总它们的结果?
- linux - 为 ARM 交叉编译 Google Protobuf
- google-cloud-platform - 关于 SSL 证书,如何通过 HTTPS 正确使用 Google Cloud IoT Core?
- javascript - 使用 Puppeteer 的 page.$$eval() 错误
- python - 如何裁剪具有未知值和大小的张量的恒定值填充(填充高度和宽度相同)?
- c# - 我正在尝试将字符串数组保存到 txt 文件
- css - CSS 中的媒体不适用于最大宽度