Hỏi về code sort 1 dãy số trong đó 1 số không đổi

ừm đúng ùi bạn nên mình làm kiểu While index < length:
lặp đến khi nào thấy index nó bằng length thì ngưng,lặp hết nguyên cái list í thì ngưng được rùi

Từ khoá bạn đang cần là stable sort.

2 Likes

Không phải stable đâu, mà làm sao nếu không đụng vào thì sẽ không bị đổi chỗ

3 Likes

Hình như bạn vẫn chưa thấy lỗi gì hay sao í nhỉ. :sob: :sob: . Mình đã gợi ý như thế này rồi :sob: .
Bài của bạn bị gặp lỗi IndexError như anh @rogp10 đã nói. Bạn có thể search thêm trên google. Bonus thêm cái hình như sai ở cả thuật toán luôn.

Thớt bắt đầu từ số 0 luôn, đề nghị thớt tìm 1 (e)book Python ổn áp tí.

4 Likes

Cảm ơn bạn nhiều để mình tra thêm xem sao TT

Hmm, vậy tạo 1 cái mảng index riêng rổi sort trên mảng index không chứa index trỏ tới số 11. Giả sử mảng ban đầu là arr, mảng index là arrindex, thì key để so sánh sẽ là arr[arrindex[i]].

Ví dụ:

//                  0    1    2    3    4    5    6    7   8  9  10  11
int arr[] =      { 56,  14,  11, 756,  34,  90,  11,  11, 65, 0, 11, 35 };
int arrindex[] = {  0,   1,        3,   4,   5,            8, 9,     11 }; 

Sau đó chỉ sort trên arrindex[] là xong.

6 Likes

Vấn đề là bài giải của bạn ở trên bạn đang dùng Selection Sort đúng không?

my_number = 11
my_list = [56, 14, 11, 756, 34, 90, 11, 11, 65, 0, 11, 35]
print(my_list)


#1. Lấy vị trí index của các số 11 đem qua 1 list khác để dành xài
my_index = []
for num in range(len(my_list)):
    if my_list[num] == my_number:
        my_index.append(num)

# Đây là kết quả của #1
print(my_index)


#2. Xoá hết mấy số 11 trong list gốc đi
while True:
    try:
        my_list.remove(my_number)
    except:
        break

#3. Sort list gốc theo thứ tự từ nhỏ -> lớn
my_number_sorted = sorted(my_list)


#4. Chèn số 11 vô list #3 tại những vị trí index đã lấy ra ở #1
for i in my_index:
    my_number_sorted.insert(i, my_number)


# Đây là kết quả
print(my_number_sorted)

[56, 14, 11, 756, 34, 90, 11, 11, 65, 0, 11, 35]
[2, 6, 7, 10]
[0, 14, 11, 34, 35, 56, 11, 11, 65, 90, 11, 756]
[Finished in 0.5s]

Còn nếu không dùng hàm sort thì cứ lấy lần lượt min() của list là xong. Cũng y như sort nhưng mất công hơn

3 Likes

Mày mò mãi mới ra thêm “1 dòng” này:

p = [56, 14, 11, 756, 34, 90, 11, 11, 65, 0, 11, 35]
pred = lambda n: n!=11
print([next(it) if pred(n) else n for it in [iter(sorted(filter(pred, p)))] for n in p])
7 Likes

nhìn 3 phần từ đầu cũng biết sai ở đâu :v

[56, 14, 11]
 ^
idx
  • không phải 11 -> l[idx] > l[idx + 1] -> swap -> +idx
[56, 14, 11]
      ^
     idx
  • không phải 11 -> l[idx] > l[idx + 1] -> swap -> ơ kìa, bạn đổi mất vị trí số 11 của l[idx + 1] rồi :3

biết sai ở đâu chưa ?

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