Tải bản đầy đủ (.pdf) (31 trang)

Ứng dụng thuật toán sắp xếp code python

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.59 MB, 31 trang )

1


Sắp xếp nổi bọt (buble sort) – xem tài liệu SGK Tin 11 (mới)
Sắp xếp nhanh (quick sort)
Sắp xếp bằng đếm phân phối (counting sort)

2


Ý tưởng:
Chọn một phần tử làm chốt (ở đây ta chọn phần tử ở vị trí giữa).
Từ trái sang tìm phần tử có vị trí lớn hơn hoặc bằng phần tử chốt, từ
phải sang tìm phần tử có vị trí bé hơn hoặc bằng phần tử chốt.
Nếu

thì đổi chỗ hai phần tử. Làm cho đến khi

.

Lúc này sẽ chia ra được 2 nhóm cần sắp xếp. Làm tương tự như vậy với
mỗi nhóm cho đến khi đã sắp xếp hết dãy.
3


Chương trình tham khảo:
Độ phức tạp:

def quickSort(array, low, high):
i = low
j = high


mid = array[(i+j) // 2 ]
while i <= j:
while array[i] < mid : i = i + 1
while array[j] > mid : j = j - 1
if i<=j:
array[i], array[j] = array[j],
array[i]
i = i + 1
j = j - 1
if iif low < j: quickSort(array,low, j)
return array
#vi du
data = [1, 7, 4, 1, 10, 9, -2]
print("Dãy chưa sắp xếp: ")
print(data)
size = len(data)
quickSort(data, 0, size - 1)
print('Dãy sau khi sắp xếp:')
print(data)

4


Trong trường hợp khóa các phần tử
nằm trong khoảng từ

tới

là các số nguyên


(min là giá trị nhỏ nhất (>=0),

max là giá trị lớn nhất của dãy số) ta có thuật toán đơn giản và
hiệu quả là sắp xếp đếm phân phối.

5


Ý tưởng: Xây dựng dãy

, trong đó

(

) là số lần xuất hiện giá trị k trong dãy.
Ví dụ: Với dãy gồm 8 phần tử có dãy khóa bằng : 2, 0, 2, 5, 1, 2, 0,
3 ta có dãy c như sau (với min=0, max=5):
c[0]

c[1]

c[2]

c[3]

c[4]

c[5]


2

1

3

1

0

1

Dãy sau khi sắp xếp: 0, 0, 1, 2, 2, 2, 3, 5
6


Chương trình tham khảo:
Độ phức tạp:

c = []
for i in range(1000001):
c.append(0)
def counting_Sort(array):
for i in array:
c[i] = c[i] + 1
for i in range(1000001):
if c[i]!=0:
for j in range(c[i]):
print(i,end=' ')
return array

data = [1, 7, 4, 1, 10, 9, 7, 3]
print("Dãy chưa sắp xếp: ")
print(data)
print('Dãy đã sắp xếp:')
counting_Sort(data)

7


Để sắp xếp mảng
list.sort(reverse=True|False, key=myFunc)

Tham số: reverse = True: Sắp xếp giảm; ngược lại là sắp xếp
tăng. Mặc định reverse = False
myFunc: hàm so sánh để sắp xếp

8


Ví dụ 1

Ví dụ 2

list = [2, 0, 6, 4, -5, 8, 9, -3]

#hàm trả về độ dài của xâu

list.sort()

def myFunc(e):


print('Sắp xếp tăng:')

return len(e)

print(list)
list.sort(reverse= True)

list = ['Ford', 'Mitsubishi', 'BMW', 'VW']

print('Sắp xếp giảm:')

#sắp xếp xâu theo độ dài tăng dần

print(list)

list.sort(key=myFunc)
print(list)

9


1. Sắp xếp dãy số

8. Cặp số bằng nhau

2. Sắp xếp ký tự H, O, A

9. Đội tình nguyện viên


3. Số nhỏ nhất

10. Sắp xếp trị tuyệt đối

4. Dãy liên tục

11. Sắp xếp sinh viên

5. Cặp đơi hồn hảo
6. Đội văn nghệ
7. Xếp hình chữ nhật
10


Ý tưởng:
Do đề bài n nhỏ (tối
đa là 1000) nên ta có
thể dùng các thuật
tốn sắp xếp thơng
thường là có thể full
điểm bài này.
Ở đây mình sẽ dùng 2
cách: đếm phân phối
và dùng hàm sort



Ý tưởng:
+ Lưu dữ liệu đọc được vào
mảng c theo quy ước:

c[0] dùng để đếm tần suất
xuất hiện của ký tự ‘H’
c[1] dùng để đếm tần suất
xuất hiện của ký tự ‘O’
c[2] dùng để đếm tần suất
xuất hiện của ký tự ‘A’
+ Sử dụng đếm phân phối vào
mảng c với min là 0, max là 2.



Ý tưởng: Đếm phân phối
- Dùng các chỉ số từ 0 đến
200: phần tử c[0] dùng để
đếm số -100, c[1] dùng để
đếm số -99, …
=> Khi đọc vào giá trị x, thì ta
đếm cho c[x+100].
- Khi xuất giá trị thì ta trừ lại
100



Ý tưởng: Đếm phân phối
Dùng 1 biến đếm

để đếm

những số đã được ghi nhận
đồng thời nhỏ hơn hoặc bằng .

Cuối cùng kết quả sẽ là

.



Ý tưởng:
Sắp xếp dãy số tăng dần
Xét chênh lệch giữa 2 số gần nhau để
tìm ra chênh lệch nhỏ nhất.



Ý tưởng:
Sắp xếp dãy số.
Ứng với mỗi 5 phần tử liên tiếp, ta xét
độ chênh lệch giữa phần tử nhỏ nhất
và phần tử lớn nhất để tìm ra được
độ chênh lệch thấp nhất.



Ý tưởng 1:
Sắp xếp dãy số khơng tăng.
Khởi tạo

,

Tìm từ đầu dãy đến cuối dãy, cặp
số đầu tiên giống nhau ta gán cho

; cặp số tiếp theo gán cho .
Kết quả là

.


Ý tưởng:
Sắp xếp dãy số khơng giảm.
Dùng 1 vịng lặp để kiểm tra
số lượng số bằng nhau.
Gọi

là số lượng số bằng

nhau ở mỗi số có trong mảng,
số lượng cặp của số đó sẽ là
, cộng tất cả lại và ta có
kết quả bài tốn.


Ý tưởng 2:
Dùng mảng đếm phân phối các
giá trị xuất hiện, khi đó nếu 1 giá
trị xuất hiện từ 2 lần trở lên (gọi
là x) thì tính số cặp tạo ra là số tổ
hợp chập 2 của x. Rút gọn lại ta
cũng được công thức như trên:
x*(x-1)//2
Cộng các giá trị lại có được kết
quả bài tốn.



×