Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Сортировка массива с помощью указателей


Автор: Dikey 16.10.2009, 17:16
Цель программы использовать для сортировки массив любого размера,копировать его и в копии делать сортировку.
Подскажите в чем ошибка??компилятор ошибок не находит VS 2008.
Я скорей с указателями напутал,укажите плиз на ошибку.
Код

void swap (int *p1,int *p2);
int a[10]={8,2,6,9,1,4,5,7,8,1},b[10];
int main (){
    for (int i=0;i<10;i++)
        b[i]=a[i];
    sort (b,10);
    for (int i=0;i<10;i++)
        cout<<b[i]<<endl;
    return 0;
}
void sort (int *p,int n){
    int i,j,low;
    for (i=0;i<n-1;i++){
        low=i;
        for (j=i+1;j<n;j++)
            if (*p+j<*p+low)    //мне непонятно как сравнить именно значения массивов а не адреса,
                low=j;                //верно ли я предполагаю что *p+j==b[j],а p+i==&b[i]  ???
    if (low!=i)
        swap(p+i,p+low);
    }
}
void swap (int *p1,int *p2){
    int temp=*p1;
    *p2=*p1;
    *p1=temp;
}


заранее благодарен.

Автор: Anikmar 16.10.2009, 17:23
Можно хоть приблизительно ее охарактеризовать?

Автор: ИванМ 16.10.2009, 17:27
Очень странная функция сортировки. Вообще не понятно что вы хотели этим сказать. Поищите в поиске стандартную функцию сортировки пузырьком или еще какую-нибудь.

Добавлено @ 17:29
Цитата(Dikey @  16.10.2009,  17:16 Найти цитируемый пост)
if (*p+j<*p+low)    //мне непонятно как сравнить именно значения массивов а не адреса,                low=j;                //верно ли я предполагаю что *p+j==b[j],а p+i==&b[i]  ???


(p+i)=&b[i] - правильно
первое надо так:
*(p+j)=b[j]

Автор: Dikey 16.10.2009, 17:31
Нужна именно этот способ сортировки.
Главное для меня фукция sort и swap,нужно чтоб фукция sort принимала разные массивы с разной размерностью и сортировала их.
тоесть я могу использовать функцию в программе несколько раз с разными массивами,допустим мне нужно отсортировать три массива по очереди,я передаю в функцию начальный адрес масива и его размерность.

Автор: ИванМ 16.10.2009, 17:40
Ваш вариант так если подкорректировать указатели:
Код

void sort (int *p,int n){
    int i,j,low;
    for (i=0;i<n-1;i++){
        low=i;
        for (j=i+1;j<n;j++)
            if (*(p+j)<*(p+low)) 
                low=j;                
    if (low!=i)
        swap(p+i,p+low);
    }
}


Но только это все равно не будет работать. Метод ошибочный.  Любой стандартный метод с вашей задачей прекрасно справится.

Автор: Dikey 16.10.2009, 17:47
пробовал,сортирует не верно,но радует и это,а то вообще ничего не происходило.
нужно отсортировать
8,2,6,9,1,4,5,7,8,1
выдает
8,2,6,9,8,9,8,8,8,9

Метод работоспособный,проверенный мной и заключается в следующем:
1. предположить что элемент массива low является наименьшим(на первом шаге это 0 элемент массива)
2. вложенный цикл обеспечивает перебор всех элементов массива вправо от сравниваемого j=i+1
3. в условии вложенного цикла сравниваются все элементы массива,если находится меньшее значение элемента чем low
то тогда этот элемент и становится low   в программе low=j
4. Условием (i!=low) не сортируем повторяющиеся элементы.
В функции swap думаю все понятно.

Автор: ИванМ 16.10.2009, 18:00
Dikey, ваш метод рабочий, так что прошу прощения. Ошибка была в функции swap. Надо так:
Код

void swap (int *p1,int *p2){
    int temp=*p1;
    *p1=*p2;
    *p2=temp;
}

функцию sort тоже измените как я сказал.

Автор: Dikey 16.10.2009, 18:05
Огромное спасибо,ошибка как всегда глупая.

Автор: Anikmar 17.10.2009, 16:02
Цитата(Dikey @  16.10.2009,  18:05 Найти цитируемый пост)
ошибка как всегда глупая. 

А бывают "умные" ошибки?  smile 

Автор: Dikey 17.10.2009, 22:46
Этот способ сортировки похож на пузырек?
мне кажется что он медленнее чем пузырек.

Код


int choise (int n){
        for (i=0;i<9;i++){
            if (q[i]>q[i+1])
             sort(&q[i],&q[i+1]);
    }
        if (n==0)
            return 0;
    return choise (n-1);
}

void sort(int *p1,int *p2){
    int temp=*p1;
        *p1=*p2;
        *p2=temp;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)