2015-06-06 3 views
-1

Напишите программу C для выполнения сортировки пузырьков по массиву из n элементов. я пишу следующий код, но условие, что остановить процесс, если мы находим, что список сортируется в любой промежуточной точкеWAP a c программа для Bubble sort

пожалуйста скажите, как я решить эту проблему ??

#include <stdio.h> 
#include <conio.h> 

void bubble_sort(int[], int); 

void main() { 
    int arr[30], num, i; 

    printf("\nEnter no of elements :"); 
    scanf("%d", &num); 

    printf("\nEnter array elements :"); 
    for (i = 0; i < num; i++) 
     scanf("%d", &arr[i]); 

    bubble_sort(arr, num); 
    getch(); 
} 

void bubble_sort(int iarr[], int num) { 
    int i, j, k, temp; 

    printf("\nUnsorted Data:"); 
    for (k = 0; k < num; k++) { 
     printf("%5d", iarr[k]); 
    } 

    for (i = 1; i < num; i++) { 
     for (j = 0; j < num - 1; j++) { 
     if (iarr[j] > iarr[j + 1]) { 
      temp = iarr[j]; 
      iarr[j] = iarr[j + 1]; 
      iarr[j + 1] = temp; 
     } 
     } 

     printf("\nAfter pass %d : ", i); 
     for (k = 0; k < num; k++) { 
     printf("%5d", iarr[k]); 
     } 
    } 
} 
+2

Если на определенной итерации вы заметили, что вам не нужно делать какие-либо свопы, что это говорит вам о списке? –

ответ

4

Хитрости заключается в том, чтобы посчитать или проверить, есть ли какая-либо замена, когда вы перебираете список элементы во внутреннем контуре, если бы не было никакой необходимости поменять какой-либо элемент, который, безусловно, означает, что список сортируется.

+0

Я думаю, что это единственный способ ответить на этот вопрос, все остальное было бы для решения проблемы для OP, что не является хорошей идеей, поскольку это требование, безусловно, является домашним заданием. –

+0

Петли также неверны. Каждая итерация должна * удалить * последний пузырящийся элемент из последовательности компараторов для всех будущих итераций. Нет смысла перебирать уже заштрихованные элементы. Uptick кстати. – WhozCraig

+1

@WhozCraig - неверно, или просто неэффективно? – ysap

0

Идея создания пузырьков состоит в том, что на каждой итерации наибольший элемент в списке достигает в конце. SO После первой итерации наибольший элемент массива достигает в конце. Аналогично, на второй итерации второй по величине элемент в массиве достигает второй второй позиции и так далее.

, поэтому вам нужно внести некоторые изменения в ваш j-контур переменной. Сделать это следующим образом:

for (i = 1; i < num; i++) { 
     for (j = 0; j < num - i; j++) { 
     if (iarr[j] > iarr[j + 1]) { 
      temp = iarr[j]; 
      iarr[j] = iarr[j + 1]; 
      iarr[j + 1] = temp; 
     } 
     } 

К этому J петле будет перебирать только те элементы, которые не отсортированных.