Professional Documents
Culture Documents
- Selection sort
+ Ý tưởng
Tạ i mỗ i lượ t, chọ n phầ n tử nhỏ nhấ t trong số cá c phầ n tử chưa đượ c sắ p. Đưa
phầ n tử đượ c chọ n và o vị trí đú ng bằ ng phép đổ i chỗ . z
Sau lượ t thứ i (i = 1..n-1) , dã y cầ n sắ p coi như đượ c chia thà nh 2 phầ n – Phầ n
đã sắ p: từ vị trí 1 đến i – Phầ n chưa sắ p: từ vị trí i +1 đến n
+ Code
void SelectionSort(int a[], int n) {
int min;
for (int i = 0; i < n-1; i++) {
min = i;
for (int j = i + 1; j < n; j++) {
if (a[j] < a[min])min = j;
}
if (a[min] < a[i])swap(a[min], a[i]);
}
}
- Insertion sort
+ Ý tưởng
Dã y cầ n sắ p đượ c chia thà nh 2 phầ n: mộ t là phầ n đã sắ p, cò n lạ i là phầ n chưa
sắ p
Tạ i mỗ i lượ t, phầ n tử đầ u tiên trong phầ n chưa sắ p sẽ đượ c “thêm” và o đú ng
vị trí củ a nó trong phầ n đã sắ p.
1|Page
+ Code
void InsertionSort(int a[], int n) {
int saved;
for (int i = 1; i < n; i++) {
saved = a[i];
int j = i;
2|Page
+ Code
void BubbleSort(int a[], int n) {
for (int i = 1; i < n - 1; i++) {
for (int j = n - 1; j >= i + 1; j--) {
if (a[j] < a[j - 1])swap(a[j], a[j - 1]);
}
}
}
- Shell sort
+ Ý tưởng
Shell sort lấ y ý tưở ng chính từ Insert sort. Shell sort hoạ t độ ng bằ ng cá ch sắ p xếp cá c
phầ n tử nằ m xa nhau, sau đó dầ n rú t ngắ n khoả ng cá ch sắ p xếp(gap), đều nà y giú p di
chuyển cá c phầ n tử đi mộ t khoả ng cá ch xa có thể giú p cá c phầ n tử đi về vị trí chính
xá c củ a mình hiệu quả hơn so vớ i việc di chuyển qua từ ng phầ n tử liền kề.
+ Code
void ShellSort(int a[], int n) {
int saved;
for (int interval = n / 2; interval > 0; interval /= 2) {
for (int i = interval; i < n; i += 1) {
int j = i;
saved = a[i];
for (; j >= interval && a[j - interval] > saved; j -= interval) {
a[j] = a[j - interval];
}
a[j] = saved;
}
}
}
3|Page
Trườ ng hợ p trung bình: O(nlog(n))
Trườ ng hợ p xấ u: O(n2)
Khô ng gian sử dung: O(1)
- Merge sort
+ Ý tưởng
Bao gồ m 3 bướ c
Chia: Phâ n chia dã y cầ n đượ c sắ p S gồ m n phầ n tử thà nh 2 dã y con vớ i số
phầ n tử là n/2 S1 và S2
Trị: Lầ n lượ t sắ p xếp hai dã y con S1 và S2 bằ ng sắ p xếp kiểu hò a nhậ p
Tổ hợ p: Nhậ p 2 dã y con đã đượ c sắ p S1 và S2 thà nh mộ t dã y duy nhấ t
+ Code
void Merge(int A[], int l, int mid, int r) {
int* tempA = new int[r-l+1];
int l1 = l; int r1 = mid;
int l2 = mid + 1; int r2 = r; int i = l;
for (; i<=r; ++i) {
if (l1 > r1 && l2 <= r2) tempA[i] = A[l2++];
else if (l2 > r2 && l1 <= r1) tempA[i] = A[l1++];
else
tempA[i] = (A[l1] < A[l2]) ? A[l1++] : A[l2++];
}
for (i = l; i <= r; ++i)
A[i] = tempA[i];
delete[] tempA;
}
4|Page
Trườ ng hợ p trung bình: O(nlog(n))
Trườ ng hợ p xấ u: O(nlog(n))
Khô ng gian sử dụ ng: O(n)
- Quick sort
+ Ý tưởng
Chia – Pha phâ n đoạ n : Chọ n mộ t phầ n tử trong dã y là m phầ n tử chố t p . Chia dã y
đã cho thà nh 3 nhó m : <p ,p,>p . p thườ ng đượ c chọ n là : vị trí đầ u, vị trí giữ a, vị
trí cuố i.
Trị: Sắ p xếp đượ c tiếp tụ c mộ t cá ch đệ qui vớ i nhó m thứ 1 và nhó m thứ 3.
+ Code
int PartitionL(int A[], int l, int r) {
int x = A[l];
int j = r + 1;
int i = l;
while (i < j) {
i++;
while ((i <= r) && (A[i] < x)) i++;
j--;
while ((j >= l) && (A[j] > x)) j--;
swap(A[i], A[j]);
}
swap(A[i], A[j]);
swap(A[j], A[l]);
return j;
}
5|Page
void QuickSortMid(int A[], int l, int r) {
int i = l, j = r;
int x = A[(l + r) / 2];
while (i <= j) {
while (A[i] < x)i++;
while (A[j] > x)j--;
if (i <= j) {
if (i < j) {
swap(A[i], A[j]);
}
i++;
j--;
}
}
if (l < j)QuickSortMid(A, l, j);
if (i < r)QuickSortMid(A, i, r);
}
6|Page
+ Code
void Heapify(int a[], int n, int i) {
int largest = i;
int l = 2 * i + 1, r = 2 * i + 2;
if (l < n && a[l] > a[largest]) largest = l;
if (r < n && a[r] > a[largest]) largest = r;
if (largest != i) {
swap(a[i], a[largest]);
Heapify(a, n, largest);
}
}
7|Page
Bước 2: Ở bướ c nà y, chú ng ta cầ n xem xét sử a đổ i giá trị củ a C. C[i] thể hiện giớ i hạ n
trên củ a chỉ số củ a phầ n tử i sau khi sắ p xếp.
8|Page
+ Code
void CountingSort(int a[], int n) {
int max = a[0], min = a[0];
int *result = new int[n];
// tìm max min của mảng
for (int i = 1; i < n; i++) {
if (a[i] > max)max = a[i];
if (a[i] < min)min = a[i];
}
int k = max - min + 1; // k là độ dài của mảng count_array
int* count_array = new int[k];
//khởi tạo các giá trị của mảng count_array là 0
for (int j = 0; j < k; j++) count_array[j] = 0;
//Đếm số lượng các phần tử phân biệt của mảng
for (int z = 0; z < n; z++)count_array[a[z] - min]++;
/* Thay đổi giá trị của count_array[p] thể hiện giới hạn trên
của chỉ số của phần tử p sau khi sắp xếp */
for (int p = 1; p < k; p++) count_array[p] += count_array[p - 1];
/* Duyệt qua từng phần tử của a và đặt nó vào đúng chỉ số của mảng
chứa các giá trị đã sắp xếp result dựa vào count_array. */
for (int q = 0; q < n; q++) {
result[count_array[a[q] - min] - 1] = a[q];
count_array[a[q] - min]--;
}
// Sao chép mảng result vào mảng a.
for (int t = 0; t < n; t++) a[t] = result[t];
delete[] result;
delete[] count_array;
}
9|Page
Khô ng gian sử dụ ng: O(max)
- Radix Sort
+ Ý tưởng
Dự a trên nguyên tắ c phâ n loạ i thư củ a bưu điện. Nó khô ng hề quan tâ m đến việc so
sá nh giá trị củ a phầ n tử và bả n thâ n việc phâ n loạ i và trình tự phâ n loạ i sẽ tạ o ra thứ tự
cho cá c phầ n tử .
+ Code
int max_array(int a[], int n) {
int max = a[0];
for (int i = 1; i < n; i++) if (a[i] > max)max = a[i];
return max;
}
10 | P a g e
delete[] result;
delete[] count;
}
11 | P a g e