ừ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
Hỏi về code sort 1 dãy số trong đó 1 số không đổi
Từ khoá bạn đang cần là stable sort.
Không phải stable đâu, mà làm sao nếu không đụng vào thì sẽ không bị đổi chỗ
Hình như bạn vẫn chưa thấy lỗi gì hay sao í nhỉ. . Mình đã gợi ý như thế này rồi .
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í.
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.
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
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])
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 ?