Code thuật toán Bubble sort bị in ra thừa 1 số

Em muốn biểu biễn thuật toán sắp xếp kiểu Bubble sort như sau:

#include <iostream>
#include <cstdint>
int main()
{

	int16_t array_6[] = { 6,3,8,0,7,2,1,9,4,5 }, n_max = sizeof(array_6) / sizeof(int16_t), x;
	for (int16_t sort(1); sort <= 10; sort++)
	{
		for (int16_t number(0); number <= n_max - 1; number++)
		{
			if (array_6[number] > array_6[number + 1])
			{
				x = array_6[number];
				array_6[number] = array_6[number + 1];
				array_6[number + 1] = x;
			}
		}
	}
	for (int16_t number(0); number <= n_max - 1; number++)
	{
		std::cout << array_6[number] << " " << std::endl;
	}
	system("pause");
	return 0;
}

Xong nó ra :


Cái số thừa ở trên là ở đâu vậy ? mong mọi người giải đáp

image
Mình build bình thường mà nhỉ.
P/s: Bạn format lại source code đi nha, vẫn còn lọt chỗ include. :slight_smile:

1 Like

Góp ý cho thuật toán của bạn. Cái vòng for bên ngoài cùng, mặc định là nó lặp 10 lần thì chưa tối ưu lắm. Vì có thể

  • Chưa đến 10 lần lặp thì đã sort song r.
  • 10 lần lặp hết r mà vẫn chưa sort song.

Bạn nên làm một hàm mới có chức năng kiểm tra xem dãy đã được sort chưa. Vd int sortedArr(int *arr) sẽ trả về 1 nếu đã đk sort và 0 trong trường hợp còn lại. Rồi thay for ngoài cùng bằng:

While(!sortedArr(arr)) {
  //do something 
}
2 Likes

Dựa trên kết quả hiện tại mình chỉ đoán là vòng lặp có khả năng bị vượt quá vị trí mảng.
Mảng arry có 10 số từ 0 đến 9. Kết quả thì đến 8 và lại thừa 1 giá trị âm ko có.
=> Xét lại code vòng lặp:
Vòng lặp chạy số lần sort (1): for (int16_t sort(1); sort <= 10; sort++)
Vòng lặp cho việc sort (2) for (int16_t number(0); number <= n_max - 1; number++)

Tại vòng (1), việc sort 10 lần mặc dù chỉ cần 9 lần dù ko gây lỗi gì nhưng hao tài nguyên về sau.

Tại vòng (2), khả năng do hiểu sai bản chất của công thức thuật toán mảng hoặc chưa hiểu rõ về vị trí giá trị mạng, bạn cho chạy từ 0 đến = n_max-1 dẫn đến lỗi chạy quá giá trị vị trí.

Ví dụ mảng có 10 giá trị nhưng sẽ chạy từ vị trí số 1 tại a[0] đến vị trị cuối cùng là 10 tại a[9] (10-1=9).
Do vậy vòng (2), đáng lẽ chỉ đến a[8] với number < n_max-1, bạn khiến nó chạy tới array_6[9] (vị trị cuối cùng có khởi tạo giá trị) dẫn đến
if (array_6[number] > array_6[number + 1]) { x = array_6[number]; array_6[number] = array_6[number + 1]; array_6[number + 1] = x; }
chạy đến array[10] (9+1) nơi ko khởi tạo giá trị. Kèm theo chắc có liên quan gì đến thư viện pch.h của bạn nữa nên nó mới ra 1 giá trị ngoài luồng ko mong muốn (lúc đem code bạn lên chạy trên máy mình thì báo lỗi thiếu pch.h).
=> Mảng từ 10 giá trị lên 11 giá trị.
=> Lúc xuất cũng chỉ xuất đến 10 kết thúc tại array_6[9]. Giá trị 9 bị đẩy sang array_6[10] nên ko có xuất hiện.

2 Likes

ok, thank bạn mik hiểu rồi :sweat_smile:

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