引言
分治排序是一種常用的排序演算法,它基於分治法(Divide and Conquer)的戰略,將一個複雜成績剖析成若干個絕對簡單的子成績,遞歸地求解這些子成績,然後再合併其成果。本文將深刻探究分治排序在C言語中的實現,包含疾速排序跟歸併排序,並揭秘高效演算法背後的機密。
疾速排序演算法道理與C言語實現
道理
疾速排序是一種高效的排序演算法,其基本頭腦是拔取一個基準元素,然後將數組分為兩部分,一部分的全部元素都比基準小,另一部分的全部元素都比基準大年夜。然後對這兩部分分辨遞歸停止疾速排序。
C言語實現
以下是疾速排序在C言語中的實現代碼:
#include <stdio.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
歸併排序演算法道理與C言語實現
道理
歸併排序也是一種高效的排序演算法,它採用分治法戰略,將待排序的序列分紅兩個相稱(或瀕臨相稱)的部分,分辨對每一部分停止排序,然後再將兩個有序的部分合併成一個有序序列。
C言語實現
以下是歸併排序在C言語中的實現代碼:
#include <stdio.h>
void merge(int arr[], int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
void mergeSort(int arr[], int l, int r) {
if (l < r) {
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
總結
經由過程本文,我們深刻懂得了分治排序演算法,包含疾速排序跟歸併排序。這些演算法在C言語中的實現展示了分治法在處理複雜成績中的利用。控制這些演算法不只能進步我們的編程才能,還能讓我們更深刻地懂得高效演算法背後的機密。