30/09/2018, 21:31

[C/C++] Sắp xếp mảng

Anh chị nào biết giúp em gợi ý câu này với ạ.

Gió viết 23:37 ngày 30/09/2018

Dùng insert sort+đệ quy

chichi viết 23:32 ngày 30/09/2018

stackoverflow.com
user3067773

How to sort without using loop

c++, sorting, loops
asked by user3067773 on 09:48PM - 04 Dec 13

Ý tưởng chế lại 2 vòng for hay dùng :))

... viết 23:31 ngày 30/09/2018

Dùng từ khóa goto.

viết 23:38 ngày 30/09/2018

ko cần goto cũng làm được mà.

ý tưởng là xài bubble sort, viết thêm 1 hàm hỗ trợ, tạm gọi là recursiveBubble(float* a, int n, int i). Giá trị ban đầu của i là 0.

ví dụ mảng a = 3 2 1 4, gọi recursiveBubble(a, n=4, i=0)

  • i = 0: so sánh a[0] với a[0+1], nếu a[i] lớn hơn thì swap a[0] và a[1]. Ở đây 3 > 2 nên swap: 2 3 1 4. Trả về recursiveBubble(a, n, i=i+1)
  • i = 1: so sánh a[1] với a[1+1], nếu a[i] lớn hơn thì swap a[1] và a[2]. Ở đây 3 > 1 nên swap: 2 1 3 4. Trả về recursiveBubble(a, n, i=i+1)
  • i = 2: so sánh a[2] với a[2+1], nếu a[i] lớn hơn thì swap a[2] và a[3]. Ở đây 3 < 4 nên ko swap: 2 1 3 4. Trả về recursiveBubble(a, n, i=i+1)
  • i+1 == 4 == n nên ko so sánh a[3] với a[4] nữa mà trả về recursiveBubble(a, n=n-1, i=0)
    v.v…
    tới khi n = 0 thì dừng.

viết lại thành insertion sort cũng dễ. Thay vì i=0, n=4 thì i=1,n=1, rồi i=i-1 và n=n+1. Có lẽ phải thêm 1 biến maxN nữa để biết lúc mà dừng ++n

Thanh Bình Lê viết 23:38 ngày 30/09/2018
void sort(int *p, int size, int temp = 0, int i = 0, int j = 0)
{
	if (i<size)
	{
		if (j == i)
			temp = p[i];
		if (j > 0 && p[j-1] > temp)
		{
			p[j] = p[j - 1];
			j--;
		}
		if (j == 0)
			p[j] = temp;
		if (j > 0)
			sort(p, size, temp, i, j);
		sort(p, size, temp, ++i, i);
	}
}

Mọi người giúp em xem code này với ạ, sao em chạy mà vẫn không ra

Thanh Bình Lê viết 23:45 ngày 30/09/2018
void recursiveBubble(int *p, int n, int i = 0)
{
	if (n == 0)
		return;
	if (i == n - 1)
	{
		recursiveBubble(p, n--, i = 0);
	}
	if (p[i] > p[i + 1])
	{
		Swap(p[i], p[i + 1]);
		recursiveBubble(p, n, i = i + 1);
	}
	recursiveBubble(p, n, i = i + 1);
}

int main(void)
{
	int p;
	int array[N] = { 37, 23, 17, 12, 72, 31, 46 };

	recursiveBubble(array, N);
	printf("The list of sorted numbers is\n");

	for (p = 0; p < N; p++)
		printf("%d ", array[p]);
	printf("\n\n");
	return 0;
}

Bạn @tntxtnt xem dùng mình với, sao mình làm giống bạn mà chưa ra được bạn ơi

viết 23:38 ngày 30/09/2018

chỗ i==n-1 phải thêm 1 cái return nữa. Nếu i==n-1 rồi thì đâu cần ktra p[i] với p[i+1] nữa. Với lại phải là --n hay n-1 chứ ko phải n–. Bỏ hết mấy cái i= luôn đi. Ta viết vậy trong mã giả kia cho dễ thấy chứ viết code cần gì @_@

	if (i == n - 1)
	{
		recursiveBubble(p, n-1, 0);
                return;
	}
Văn Dương viết 23:37 ngày 30/09/2018

Mình khoái goto.

Mà nói thật mấy cái bài kiểu này lãng xẹt vl. Thà bắt người ta khai triển cách nào tối ưu nhất thì không làm lại đi làm theo kiểu “đụt tư duy”.

viết 23:41 ngày 30/09/2018

goto nếu chuyển thành mã máy thì coi như là vòng lặp rồi

Thanh Bình Lê viết 23:41 ngày 30/09/2018

Mình cảm ơn nhiều nha, mình làm ra được rồi

Bài liên quan
0