LINUX.ORG.RU

анекдот про сишку

 ,


0

2

Есть совсем простой helloworld:

#include	<stdio.h>
#include	<stdlib.h>
#include	<time.h>

void fill_array(int *arr, int border);
void display_array(const int *arr, int border);
void shiffle(int *arr, int border);
void swap(int *arr, int a, int b);
void bubble_sort(int *arr, int border);

void fill_array(int *arr, int border) {
	for(int i=0; i<border; ++i) {
		arr[i] = i;
	}
}

void display_array(const int *arr, int border) {
	for(int i=0; i<border; ++i) {
		printf("%3d", arr[i]);
	}
	printf("\n");
}

void shiffle(int *arr, int border) {
	srand(time(NULL)); 
	for(int elem=border-1; elem>0; --elem) {
		int pos = rand() % (elem+1);
		swap(arr, arr[elem], arr[pos]);
	}
}

void swap(int *arr, int a, int b) {
	int tmp = arr[a];
	arr[a] = arr[b];
	arr[b] = tmp;
}

void bubble_sort(int *arr, int border) {
	for(int i=0; i<border-2; ++i) {
		for(int j=0; j<border-2; ++j) {
			int nxt=j+1;
			if(arr[j]>arr[nxt]) {
				swap(arr, arr[j], arr[nxt]); 
			}
		}
		display_array(arr, border);
	}
}

int main() {
	const int border=20;
	int arr[20] = {0};

	fill_array(arr, border);
	display_array(arr, border);
	shiffle(arr, border);
	display_array(arr, border);
	bubble_sort(arr, border);
	display_array(arr, border);

	return 0;
}

только вывод немного странный

$ ./bubble_sort 
  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
  9  6  3  8 18  7  2  0 13  5 15 16  1  4 19 14 11 17 12 10
 17 11  4  5 18  7 10 12 13  2 15 16  1  3  8 14  6  9  0 19
 17  0 15  5  3  7  8  2 13 11  4 18  6  1 10 14  9 16 12 19
 16  8 13  7 14  5  0  2 15 12  4 17  6  1 10 18  9  3 11 19
 11  8  3  7 14 10 13  1  9 12 16 17  6  2  5  4 15  0 18 19
  6  2  3 17 15 16 13  1  9 12  0  7 11  8 10  4 14  5 18 19
 11 14 13  2  4  0  1  3  9 12 16  7  6  8 10  5 17 15 18 19
  4 14 10 13 11  2 17  1  0 12 16  7  6  9  8  5  3 15 18 19
  8  4  3 13 11  9 17  1  6 12 15 10  0  7 16  5  2 14 18 19
  5  8  3  6 16  9 17 10 11  7 15  1  0 12  2 14 13  4 18 19
 15  5  0 11 16  9  4  2  6 13 17  1  3 12 10 14  7  8 18 19
 14  8  7 11  0 12  4  2  6  9  3  1 17 15 10 16 13  5 18 19
  6 16  3 11 17 15  4  9  2 10  7 14  0 12  1  8 13  5 18 19
  1 16 10 13  5 15  0  9  2  3  7  8  4 12  6 17 11 14 18 19
 17  3 16 13  5 12  4  9  8 10 11  2  1 15  6  0  7 14 18 19
 17  0  2 14  9  7  4  5  8 10 11 16  6 15 12  1  3 13 18 19
 13  0  2 14 16  7  3  9  5  8  1 12  6 15 10 11  4 17 18 19
 15  5  2  4 16 10  6 13  0 12  1  8  3 14  7 11  9 17 18 19
  1  3  9  4  8  7  6 13 11 12 15 14  5 16  2 10  0 17 18 19
  1  3  9  4  8  7  6 13 11 12 15 14  5 16  2 10  0 17 18 19

$ uname -a
OpenBSD lexx.my.domain 7.8 GENERIC.MP#1 amd64

Скажите где я дурак, или пните в нужную сторону. Заранее благодарю.



Последнее исправление: tt (всего исправлений: 1)

Для начала:

shiffle -> shuffle

fill_array(arr, border);
display_array(arr, border);
printf("\n");

shiffle(arr, border);
display_array(arr, border);
printf("\n");

bubble_sort(arr, border);
display_array(arr, border);

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)

или пните в нужную сторону

https://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort#C:

#include <stdio.h>

void bubble_sort (int *a, int n) {
    int i, t, j = n, s = 1;
    while (s) {
        s = 0;
        for (i = 1; i < j; i++) {
            if (a[i] < a[i - 1]) {
                t = a[i];
                a[i] = a[i - 1];
                a[i - 1] = t;
                s = 1;
            }
        }
        j--;
    }
}

int main () {
    int a[] = {4, 65, 2, -31, 0, 99, 2, 83, 782, 1};
    int n = sizeof a / sizeof a[0];
    int i;
    for (i = 0; i < n; i++)
        printf("%d%s", a[i], i == n - 1 ? "\n" : " ");
    bubble_sort(a, n);
    for (i = 0; i < n; i++)
        printf("%d%s", a[i], i == n - 1 ? "\n" : " ");
    return 0;
}
dataman ★★★★★
()
Ответ на: комментарий от dataman

«Bubble sort» was yesterday. Now it is «I can’t believe it can sort» → https://arxiv.org/abs/2110.01111

void
sort(int *a, int n)
{
	int i, j, tmp;
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			if (a[i] < a[j]) {
				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
	}
}
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 3)
Ответ на: комментарий от beastie

«I can’t believe it can sort»

на скриптовом REXX работало:

/* create array */
arr. = 0
do i=1 to 20
  arr.i = random(1,30)
end

/* show array content */
s = ''
do i=1 to 20
  s = s || arr.i || ' '
end
say s

/* bubble sort */
do i=1 to 20-1
  do j=1 to 20-i
    next = j+1
    if arr.j > arr.next then do
      _tmp_ = arr.next
      arr.next = arr.j
      arr.j = _tmp_
      end
  end
end

s = ''
do i=1 to 20
  s = s || arr.i || ' '
end
say s

exit 0
tt
() автор топика

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

cobold ★★★★★
()