#include <stdio.h>
void sort_count(int in[],int out[],int n)
{ int i,j ,count;
for (i=0; i< n; i++)
{
for ( count=0,j=0;j<n; j++)
if (in[j] < in)
count++; // Подсчитывает количество элеменов перед текущим
out[count]=in; // Определяет его место в выходном массиве
}
}
void main()
{
int a[]={41,7,8,40,8};// Входной массив
int b[5]={0}; // Выходной массив
int n=sizeof(a)/sizeof(int);
sort_count(a,b,n);
for (int i=0; i<n; i++)
printf("%d ",b);
puts("");
}
Сортировка подсчетом
Здравствуйте, посоветуйте в доработке функции сортировки. Программа сортирует подсчетом целочисленный массив, но когда встречаются повторяющиеся числа то первое выводится правильно, а остальные выводятся в виде нулей. Заранее благодарен.
Код:
void sort_count(int in[], int out[], int n)
{
int i, j, count;
for (i=0; i<n; i++)
{
for (count=0, j=0; j<n; j++)
if (in[j] < in)
count++; // Подсчитывает количество элеменов перед текущим
out[count] = in; // Определяет его место в выходном массиве
}
}
void main()
{
int a[] = { 41, 7, 8, 40, 8}; // Входной массив
int b[5] = { 0 }; // Выходной массив
int n = sizeof(a)/sizeof(int);
sort_count(a, b, n);
for (int i=0; i<n; i++)
printf("%d ",b);
puts("");
}
{
int i, j, count;
for (i=0; i<n; i++)
{
for (count=0, j=0; j<n; j++)
if (in[j] < in)
count++; // Подсчитывает количество элеменов перед текущим
out[count] = in; // Определяет его место в выходном массиве
}
}
void main()
{
int a[] = { 41, 7, 8, 40, 8}; // Входной массив
int b[5] = { 0 }; // Выходной массив
int n = sizeof(a)/sizeof(int);
sort_count(a, b, n);
for (int i=0; i<n; i++)
printf("%d ",b);
puts("");
}
Теперь по делу.
Анализ показывает, что повторяющиеся числа помещаются все в одно место. Соответствено, в целевом массиве остаются нули.
Перерабатывайте алгоритм, вводите дополнительные проверки.
Цитата: koodeer
Теперь по делу.
Анализ показывает, что повторяющиеся числа помещаются все в одно место. Соответствено, в целевом массиве остаются нули.
Перерабатывайте алгоритм, вводите дополнительные проверки.
Анализ показывает, что повторяющиеся числа помещаются все в одно место. Соответствено, в целевом массиве остаются нули.
Перерабатывайте алгоритм, вводите дополнительные проверки.
Можно например так попробовать.
Вместо
Код:
if (in[j] < in)
count++; // Подсчитывает количество элеменов перед текущим
count++; // Подсчитывает количество элеменов перед текущим
сделать
Код:
if (in[j] < in || in[j] == in && j < i)
count++; // Подсчитывает количество элеменов перед текущим
count++; // Подсчитывает количество элеменов перед текущим
Правда не совсем красиво - усложнение условия...
Цитата: Ghox
Можно например так попробовать.
...
Правда не совсем красиво - усложнение условия...
...
Правда не совсем красиво - усложнение условия...
В отдельный цикл можно:
Код:
{
for (int j = 0; j < n; j++)
if (in[j] < in)
count++;
for (int j = 0; j < i; j++)
if (in[j] == in)
count++;
}
for (int j = 0; j < n; j++)
if (in[j] < in)
count++;
for (int j = 0; j < i; j++)
if (in[j] == in)
count++;
}