Cần gợi ý sắp xếp mảng số thực

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

1 Like

Dùng insert sort+đệ quy

2 Likes


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

2 Likes

Dùng từ khóa goto.

2 Likes

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

3 Likes
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

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

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;
	}
1 Like

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”.

1 Like

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

2 Likes

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

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?