You are on page 1of 6

Bài tập lí thuyết tuần 3

Trần Ngọc Minh Trang -23521631

1. Trong các thuật toán sắp xếp Selection Sort, Insertion Sort, Counting Sort và Radix Sort, thuật toán nào là sắp
xếp ổn định (Stable)? Vì sao?
Trong các thuật toán sắp xếp mà bạn liệt kê, có hai thuật toán là sắp xếp ổn định (stable), đó là Insertion Sort và Counting
Sort. Dưới đây là lý do tại sao chúng được coi là sắp xếp ổn định:

Insertion Sort:
• Insertion Sort là một thuật toán sắp xếp ổn định.
• Trong quá trình sắp xếp, nếu có hai phần tử có giá trị bằng nhau, thì phần tử xuất hiện trước sẽ được giữ nguyên ở vị trí
của mình, không bị đổi chỗ.
• Vì vậy, khi sắp xếp dãy số, nếu có các phần tử có cùng giá trị, thì thứ tự của chúng trong mảng sau khi sắp xếp sẽ không bị
thay đổi.
Counting Sort:
• Counting Sort cũng là một thuật toán sắp xếp ổn định.
• Thuật toán này hoạt động dựa trên việc đếm số lần xuất hiện của các phần tử.
• Khi xử lý các phần tử có giá trị bằng nhau, Counting Sort sẽ đặt chúng vào cùng một vị trí trong mảng kết quả dựa trên
thứ tự xuất hiện trong mảng ban đầu.
• Do đó, nó đảm bảo rằng thứ tự của các phần tử bằng nhau sẽ không bị đảo ngược sau khi sắp xếp.

Như vậy, Insertion Sort và Counting Sort là hai trong số các thuật toán được coi là ổn định trong quá trình sắp xếp dãy số.
2. Cho mảng A={8,2,1,9,4,5,7,6,3}. Hãy viết hàm sắp xếp và trình bày từng bước quá trình sắp xếp mảng A theo thứ tự
giảm dần (>) với thuật toán:

a) Selection Sort:

void selectsort(int a[], int n)


{
int max;
for (int i = 0; i < n - 1; i++)//vòng lặp 1
{
max = i;
for (int j = i + 1; j < n; j++)//vòng lặp 2
if (a[j] > a[i])
max = j;
swap(a[max], a[i]);
}

Bước 1:

Mảng ban đầu: [8, 2, 1, 9, 4, 5, 7, 6, 3]

bắt đầu vòng lặp 1

i=0, max=0

bắt đầu vòng lặp 2

j=1<n

Kiểm tra điều kiện 2>8 sai


j=2<n

Kiểm tra điều kiện 1>8 sai

j=3<n

Kiểm tra điều kiện 9>8 đúng

Max=3

j=4<n

Kiểm tra điều kiện 4>9 sai

j=5<n

Kiểm tra điều kiện 5>9 sai

j=6<n

Kiểm tra điều kiện 7>9 sai

j=8<n

Kiểm tra điều kiện 3>9 sai

j=9<n sai thoát khỏi vòng lặp 2

đổi chỗ a[3] và a[0]

[9, 2, 1, 8, 4, 5, 7, 6, 3]

Bước 2:

i=1, min =1

bắt đầu vòng lặp 2

j=2<n

Kiểm tra điều kiện 1>2 sai

j=3<n

Kiểm tra điều kiện 8>1 đúng

max=3

j=4<n

Kiểm tra điều kiện 4>8 sai

j=5<n

Kiểm tra điều kiện 5>8 sai


j=6<n

Kiểm tra điều kiện 7>8 sai

j=7<n

Kiểm tra điều kiện 6>8 sai

j=8<n

Kiểm tra điều kiện 3>8 sai

j=9<n sai

thoát khỏi vòng lặp 2

đổi chỗ a[3] và a[1]

[9, 8, 1, 2, 4, 5, 7, 6, 3]

Bước 3:

[9, 8, 7, 2, 4, 5, 1, 6, 3]

Bước 4

[9, 8, 7, 6, 4, 5, 1, 2, 3]

Bước 5

[9, 8, 7, 6, 5, 4, 1, 2, 3]

Bước 6

[9, 8, 7, 6, 5, 4, 1, 2, 3]

Bước 7

[9, 8, 7, 6, 5, 4, 3, 2, 1]

Bước 8

[9, 8, 7, 6, 5, 4, 3, 2, 1]

Mảng cuối cùng sau khi sắp xếp giảm dần: [9, 8, 7, 6, 5, 4, 3, 2, 1]

b) Insertion Sort:

void insertionSort(int arr[], int n) {


for (int i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] < key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}

Bước 1:

Mảng ban đầu: [8, 2, 1, 9, 4, 5, 7, 6, 3]

i=1

j=i-1=i-1=0;

a[i]=2=key,

kiểm tra điều kiện =>a[j]=8<key=2 =>sai

a[j+1]=a[1]=key=2

[8, 2, 1, 9, 4, 5, 7, 6, 3]

Bước 2:

i=2, a[i]=1,j=1,key=1

Kiểm tra điều kiện(1>=0 và a[j]=2<1) sai

a[2]=key=1

[8, 2, 1, 9, 4, 5, 7, 6, 3]

Bước 3:

i=3, j=2,a[i]=key=9, a[j]=1

Kiểm tra điều kiện(2>=0 và a[j]=1<9) đúng

A[j+1]=a[3]=1

j=j-1=1

[8, 2, 1, 1, 4, 5, 7, 6, 3]

Kiểm tra điều kiện(1>=0 và a[j]=1<9) đúng

A[j+1]=a[2]=2

j=0

[8, 2, 2, 1, 4, 5, 7, 6, 3]

Kiểm tra điều kiện(0>=0 và a[j]=8<9) đúng

A[1]=8

j=-1

[8, 8, 2, 1, 4, 5, 7, 6, 3]

Kiểm tra điều kiện(-1>=0 và a[j]<9) sai thoát khỏi vòng lặp
A[j+1]=a[0]=9

[9, 8, 2, 1, 4, 5, 7, 6, 3]

Bước 4

[9, 8, 2, 1, 4, 5, 7, 6, 3]

i=4,a[i]=4, j=3,a[j]=1,key=4

[9, 8, 4, 2, 1, 5, 7, 6, 3]

Bước 5

[9, 8, 4, 2, 1, 5, 7, 6, 3]

i=5, j=4, a[i]=5, a[j]=1, key=5

[9, 8, 5, 4, 2, 1, 7, 6, 3]

Bước 6

[9, 8, 5, 4, 2, 1, 7, 6, 3]

I=6, j=5, a[i]=1, a[j]=1, key =6

[9, 8, 7, 5, 4, 2, 1, 6, 3]

Bước 7

[9, 8, 7, 5, 4, 2, 1, 6, 3]

I=7, j=6, a[i]=6, a[j]=1, key=6

[9, 8, 7, 6, 5, 4, 2, 1, 3]

Bước 8

[9, 8, 7, 6, 5, 4, 2, 1, 3]

I=8, j=7, a[i]=3, a[j]=1, key=3

Mảng cuối cùng sau khi sắp xếp giảm dần: [9, 8, 7, 6, 5, 4, 3, 2, 1]

3. Định nghĩa cấu trúc dữ liệu lưu trữ thông tin máy tính gồm: nhãn hiệu máy, tốc độ xử lý (tính theo GHz) và giá bán.
Cài đặt các hàm sau
a)sortByName(…) Sắp xếp danh sách máy theo thứ tự tăng dần đối với nhãn hiệu
void sortByName(Computer arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (arr[min].brand > arr[j].brand)
min = j;
}
swap(arr[min], arr[i]);
}
}
b)sortBySpeed(…) Sắp xếp danh sách máy theo thứ tự giảm dần đối với tốc độ xử lý
void sortBySpeed(Computer arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int max = i;
for (int j = i + 1; j < n; j++) {
if (arr[max].speed < arr[j].speed)
max = j;
}
swap(arr[max], arr[i]);
}
}

c)sort(…) Sắp xếp danh sách máy theo thứ tự tăng dần giá bán và trong trường hợp cùng giá thì xếp theo thứ tự giảm
dần tốc độ xử lý
void sort(Computer arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (arr[min].price > arr[j].price || ((arr[min].price == arr[j].price &&
arr[min].speed < arr[j].speed))) {
min = j;
}
}
swap(arr[min], arr[i]);
}
}

d)filter(…) Lọc danh sách các máy tính có giá trong đoạn [p1, p2] và tốc độ xử lý trong đoạn [s1, s2].
void filter(Computer arr[], int n, double p1, double p2, double s1, double s2) {
for (int i = 0; i < n; i++) {
if (arr[i].price >= p1 && arr[i].price <= p2 &&
arr[i].speed >= s1 && arr[i].speed <= s2) {
cout << "Nhan hieu: " << arr[i].brand << ", ";
cout << "Toc do xu ly: " << arr[i].speed << " GHz, ";
cout << "Gia ban: " << arr[i].price << " USD\n";
}
}
}

You might also like