文章目录
排序算法
1. 冒泡排序
void bubbleSort(int arr[], int n) {
int flag = 0;
for (int i = 1; i <= n - 1; i++) {
for (int j = 0; j < n - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1;
}
}
if (!flag) break;
}
}
2. 选择排序
void selectSort(int arr[], int n) {
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
3. 插入排序
void insertSort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int temp = arr[i], j = i;
while (j > 0 && temp < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = temp;
}
}
4. 归并排序
4.1 二路归并(递归)
const int maxn = 100;
void merge(int A[], int L1, int R1, int L2, int R2) {
int i = L1, j = L2;
int temp[maxn], index = 0;
while (i <= R1 && j <= R2) {
if (A[i] <= A[j]) {
temp[index++] = A[i++];
} else {
temp[index++] = A[j++];
}
}
while (i <= R1) temp[index++] = A[i++];
while (j <= R2) temp[index++] = A[j++];
for (i = 0; i < index; i++) {
A[L1 + i] = temp[i];
}
}
void mergeSort(int A[], int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(A, left, mid);
mergeSort(A, mid + 1, right);
merge(A, left, mid, mid + 1, right);
}
}
4.2 二路归并(非递归)
const int maxn = 100;
void merge(int A[], int L1, int R1, int L2, int R2) {
int i = L1, j = L2;
int temp[maxn], index = 0;
while (i <= R1 && j <= R2) {
if (A[i] <= A[j]) {
temp[index++] = A[i++];
} else {
temp[index++] = A[j++];
}
}
while (i <= R1) temp[index++] = A[i++];
while (j <= R2) temp[index++] = A[j++];
for (i = 0; i < index; i++) {
A[L1 + i] = temp[i];
}
}
void mergeSort(int A[], int n) {
for (int step = 2; step / 2 <= n; step *= 2) {
for (int i = 0; i < n; i += step) {
int mid = i + step / 2 - 1;
if (mid + 1 <= n) {
merge(A, i, mid, mid + 1, min(i + step - 1, n));
}
}
}
}
4.3 用sort函数替代merge实现
void mergeSort(int A[], int n) {
for (int step = 2; step / 2 <= n; step *= 2) {
for (int i = 0; i < n; i += step) {
sort(A + i, A + min(i + step, n + 1));
}
}
}
5. 快速排序
5.1 总是以A[left]为主元
int partition(int A[], int left, int right) {
int temp = A[left];
while (left < right) {
while (left < right && A[right] > temp) right--;
A[left] = A[right];
while (left < right && A[left] < temp) left++;
A[right] = A[left];
}
A[left] = temp;
return left;
}
void quickSort(int A[], int left, int right) {
if (left < right) {
int pos = partition(A, left, right);
quickSort(A, left, pos - 1);
quickSort(A, pos + 1, right);
}
}
5.2 随机主元
int randPartition(int A[], int left, int right) {
int p = (int)(round(1.0 * rand() / RAND_MAX * (right - left) + left));
swap(A[p], A[left]);
int temp = A[left];
while (left < right) {
while (left < right && A[right] > temp) right--;
A[left] = A[right];
while (left < right && A[left] < temp) left++;
A[right] = A[left];
}
A[left] = temp;
return left;
}
void quickSort(int A[], int left, int right) {
if (left < right) {
int pos = randPartition(A, left, right);
quickSort(A, left, pos - 1);
quickSort(A, pos + 1, right);
}
}