目录
1.选择排序
#include <stdio.h>
#include <stdlib.h>
void swap(int* arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
int main()
{
int n = 0;
scanf("%d", &n);
int* arr = (int*)malloc(4 * n);
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
int cur = 0;
for (int i = 0; i < n-1; i++) {
cur = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[cur]) {
cur = j;
}
}
if (cur != i) {
swap(arr, i, cur);
}
}
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
2.冒泡排序
#include <stdio.h>
#include <stdlib.h>
void swap(int* arr, int x, int y) {
int tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}
void BubbleSort(int* arr, int L, int R) {
if (arr == NULL || R - L - 1 < 2) {
return;
}
for (int i = R; i > L; i--) {
for (int j = L; j < i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int)*n);
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
BubbleSort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
3.插入排序
#include <stdio.h>
#include <stdlib.h>
void swap(int* arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
int main()
{
int n = 0;
scanf("%d", &n);
int* arr = (int*)malloc(n * 4);
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
for (int i = 1; i < n; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j - 1]) {
swap(arr, j, j - 1);
}
else {
break;
}
}
}
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
4.归并排序
#include <stdio.h>
#include <stdlib.h>
void Merage(int* arr, int L, int M, int R) {
int* help = (int*)malloc(sizeof(int)*(R - L + 1));
int p1 = L, p2 = M + 1;
int i = 0;
while (p1 <= M && p2 <= R) {
help[i++] = (arr[p1] > arr[p2] ? arr[p2++] : arr[p1++]);
}
while (p1 <= M) {
help[i++] = arr[p1++];
}
while (p2 <= R) {
help[i++] = arr[p2++];
}
for (int j = 0; j <= R - L; j++) {
arr[L + j] = help[j];
}
free(help);
help = NULL;
}
void Merage_Sort(int* arr, int L, int R) {
if (L == R) {
return;
}
int mid = (L + ((R - L) >> 1));
Merage_Sort(arr, L, mid);
Merage_Sort(arr, mid + 1, R);
Merage(arr, L, mid, R);
}
int main()
{
int n = 0;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int)*n);
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
Merage_Sort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
5.堆排序
#include <stdio.h>
#include <stdlib.h>
int size = 0;
void swap(int* arr,int x,int y){
if (arr == NULL) {
return;
}
int tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}
void heepdive(int* arr, int width) {
if (arr == NULL){
return;
}
int index = width;
while (arr[index] > arr[(index - 1) / 2]) {
swap(arr, index, (index - 1) / 2);
index = (index - 1) / 2;
}
}
void HeepIfy(int* arr) {
if (arr == NULL) {
return;
}
int index = 0, largest = 0;
int leaf = 2 * index + 1;
while (leaf < size) {
largest = (leaf + 1 < size) && (arr[leaf] < arr[leaf + 1]) ? leaf + 1 : leaf;
largest = arr[index] < arr[largest] ? largest : index;
if (largest == index) {
break;
}
swap(arr, index, largest);
index = largest;
leaf = index * 2 + 1;
}
}
void HeepSort(int* arr, int L, int R) {
for (int i = 0; i < (R - L + 1); i++) {
swap(arr, L, size - 1);
size--;
HeepIfy(arr);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int)*n);
for (int i = 0; i < n; i++) {
scanf("%d", arr + size);
size++;
heepdive(arr, size - 1);
}
HeepSort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
6.快速排序
#include <stdio.h>
#include <stdlib.h>
int random(int a, int b) {
return (rand() % b + a);
}
void swap(int* arr, int x, int y) {
int tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}
int* sort(int* arr, int L, int R) {
int small = L - 1;
int more = R;
int cur = L;
while (cur < more) {
if (arr[cur] < arr[R]) {
swap(arr, cur++, ++small);
}
else if (arr[cur] > arr[R]) {
swap(arr, cur, --more);
}
else {
cur++;
}
}
swap(arr, more, R);
int* help = (int*)malloc(4 * 2);
help[0] = small + 1;
help[1] = more;
return help;
}
void QuickSort(int* arr, int L, int R) {
if (arr == NULL || R - L + 1 < 2) {
return;
}
if (L >= R) {
return;
}
swap(arr, random(L, R), R);
int* p = sort(arr, L, R);
QuickSort(arr, L, *p - 1);
QuickSort(arr, *(p + 1) + 1, R);
}
int main()
{
int n = 0;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int)*n);
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
QuickSort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
7.桶排序:
1.计数排序
2.基数排序
#include <stdio.h>
#include <stdlib.h>
int getDigit(int num, int i) {
int res = 0;
i -= 1;
while (i--) {
res = num / 10;
}
return num % 10;
}
void RadixSort(int* arr, int L, int R, int digit) {
if (arr == NULL || R - L + 1 < 2) {
return;
}
int* help = (int*)malloc(sizeof(int)*(R - L + 1));
int* count = (int*)malloc(sizeof(int) * 10);
for (int i = 1; i <= digit; i++) {
for (int c = 0; c < 10; c++) {
count[c] = 0;
}
for(int j = L; j <= R; j++) {
count[getDigit(arr[j], i)]++;
}
for (int p = 1; p < 10; p++) {
count[p] += count[p - 1];
}
for (int q = R; q >=L; q--) {
help[--count[getDigit(arr[q], i)]] = arr[q];
}
for (int z = L; z <= R; z++) {
arr[z] = help[z-L];
}
}
}
int maxbits(int* arr, int n) {
if (arr == NULL) {
return 0;
}
int max = arr[0], i = 0, res = 0;
for (i = 0; i < n; i++) {
max = max < arr[i] ? arr[i] : max;
}
while (max > 0) {
res++;
max /= 10;
}
return res;
}
int main()
{
int n = 0;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int)*n);
for (int i = 0; i < n; i++) {
scanf("%d", arr + i);
}
RadixSort(arr, 0, n - 1, maxbits(arr, n));
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
总结:
1.不具备稳定性的排序:选择排序,快速排序,堆排序;
具备稳定性的排序:冒泡排序,插入排序,归并排序,一切桶排序思想下的排序。
目前没有找到时间复杂度为O(n*log(n)),额外空间复杂度为O(1),又稳定的排序。
2.
时间复杂度 | 空间复杂度 | 是否具有稳定性 | |
---|---|---|---|
选择排序 | O(n^2) | O(1) | 无 |
冒泡排序 | O(n^2) | O(1) | 有 |
插入排序 | O(n^2) | O(1) | 有 |
归并排序 | O(n*log(n)) | O(n) | 有 |
快速排序 | O(n*log(n)) | O(log(n)) | 无 |
堆排序 | O(n*log(n)) | O(1) | 无 |
3.工程上对算法的改进:1.充分利用O(n^2)和O(n*log(n))各自的优势;2.稳定性的考虑。