我需要创建一个对一维数组进行排序的函数,使得小于第一个元素的数字在它之前移动,数字大于或等于之后移动。这是我的代码:
#include<stdio.h>
void sort(int a[], int n);
int main(){
int a[10], i, m;
do{
printf("Enter number of elements: ");
scanf("%d", &m);
} while (m < 1 || m > 10);
for (i = 0; i < m; i++)
scanf("%d", &a[i]);
for (i = 0; i < m; i++)
sort(a, m);
for (i = 0; i < m; i++)
printf("%d ", a[i]);
return 0;
}
void sort(int a[], int m){
int i, j, p, temp;
p = a[1];
for (j = 2; j < m; j++){
if (p >= a[j]){
temp = a[j];
a[j] = a[1];
a[1] = temp;
}
}
}
答案 0 :(得分:3)
排序功能是个问题。通过纸上的逻辑工作,你会看到发生了什么。你的p被固定到位,这是问题的一部分。您会注意到您的输入正在移动,这仅仅是它如何移动它们
如果将其放置到位,此排序功能应该有效。
void sort(int a[], int m){
int i, j, p, temp;
for (i =0; i<m;i++){
for(j=i;j<m;j++){
if (a[j]<a[i]){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
编辑,哦,我可能误解了你的问题。这是说你不希望它们处于完全完美的顺序,而是你想要比起始元素小的东西在它前面,但是它们在输入时的顺序是相同的吗?
编辑2: 对不起,我误解了你以前的问题。这就是我想出的。
#include<stdio.h>
void sort(int a[], int n);
int main(){
int a[10], i, m;
do{
printf("Enter number of elements: ");
scanf("%d", &m);
} while (m < 1 || m > 10);
for (i = 0; i < m; i++)
scanf("%d", &a[i]);
sort(a, m);
for (i = 0; i < m; i++)
printf("%d ", a[i]);
return 0;
}
void sort(int a[], int m){
int i, j, p, temp;
int pindex;
p = a[0];
pindex =0;
for (i =0; i<m;i++){
if(a[i]<p){
temp = a[i];
for(j=i;j>pindex;j--){
a[j] = a[j-1];
}
a[pindex]=temp;
pindex++;
}
}
}
我认为最初方法的最大问题是每次循环运行时都将p设置为第一个元素。如果p随着每次迭代而改变,则最终会破坏所有内容。
我所做的更改:我使用名为pindex的变量跟踪p的当前位置。每当我发现一个小于p的元素时,我会将每个元素向后滑动,直到我到达p(包括p)。然后我将我在索引中找到的元素放在p是。
希望有帮助。