Помогите отсортировать массив на C
не понимаю как отсортировать массив на С ,чтоб сначала шли элементы по возростанию , а потом нули
задается интервал от [n до n_n] , в котором числа остаются , в противном случае числа обнуляются ,
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int N=10;
int cmpfunc (const void * a, const void * b) {
return ( *(int*)a - *(int*)b );
}
int main()
{
int a[N];
int k,n,n_n,sum,i,j,temp;
k=0;
printf("vvedite nachalinoe i konechnoe znacenie intervala\n");
scanf("%d%d", &n , &n_n);
for ( i=0 ; i <N ; i++){
printf("%d=", i+1 );
scanf("%d" , &a[i]);
}
for (j=0 ; j<N ; j++){
if(a[j] > k) k=a[j];
}
printf("maksimalinii polojelemmassiva=%d\n" , k);
for (i=0 ;i<N ;i++){
sum = sum + a[i];
}
sum -= k ;
printf ("summa massiva=%d\n", sum);
for ( i=0; i<N; i++){
if ( n > a[i] || a[i] > n_n){
a[i]=0;
}
}
qsort(a,N,sizeof(int),cmpfunc);
for (j=0;j<N;j++){
for ( i=0; i< N ; i++){
if (a[i]<a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}/*
for(i=0;i<n_n-n;i++){
if (a[i]>a[i+1]){
for (i=0; i <n_n-n;i++){
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
*/
printf("sorted massiv a =");
for (int j = 0; j < N; j++)
printf("%d ; ",a[j]);
return 0;
}
проблема заключается в том , что не могу отсортировать в самом конце по возрастанию , первые n_n - n элементов

по идее должно было выводить 3;4;0;0;0;0;0;0;0;0;
Ответы (2 шт):
значение sum не определено вначале, но затем вы хорошо с ним складываете
и почему тогда уж не sum += a[i]?
for (i=0 ;i<N ;i++){
sum = sum + a[i];
}
если вы отсортировали массив и вам нужно нули в конец переместить, то почему бы ни
подсчитать кол-во 0 (M)
переместить поэлементно все элементы с
pos = M..nn-1доpos = 0..nn-1-Mостальное заполнить нулями от
pos = nn-1-Mдоpos = nn-1for (j=0;j<N;j++){ for ( i=0; i< N ; i++){ if (a[i]<a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } }
Я расскажу в общем случае, ну, а вы уж свои границы для сортировки подставьте сами.
Итак, qsort никто не отменял, даже вы им пытаетесь пользоваться - тогда почему бы не воспользоваться им нормально? просто написав нормальный компаратор, решающий нашу задачу!
int trick_comp(const void* a_, const void* b_)
{
int a = *(int*)a_, b = *(int*)b_;
if (a && b == 0) return -1;
if (b && a == 0) return 1;
return (a < b) ? -1 : (a > b) ? 1 : 0;
}
void trick_sort(int * a, int N)
{
qsort(a,N,sizeof(int),trick_comp);
}
Вот и все.
Полный код можно посмотреть здесь - https://ideone.com/bMGttH