冒泡排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <stdio.h>
void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 直接交换元素的值 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); }
bubbleSort(arr, n);
printf("\nSorted array: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); }
return 0; }
|
选择排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include<stdio.h> void swap(int* arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } void selectionSort(int *arr,int length) { if (arr == NULL || length < 2) { return; } for (int i = 0; i < length - 1; i++) { int minIndex = i; for (int j = i + 1; j < length; j++) { minIndex = arr[j] < arr[minIndex] ? j : minIndex;
} swap(arr, i, minIndex); }
} int main() { int a[5] = {31,1,3,5,7}; selectionSort(a,5); for (int i = 0; i < 5; i++) { printf("%d\n", a[i]); } return 0; }
|
插入排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include<stdio.h> void swap(int* arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } void insertionSort(int *arr,int length){ if (arr == NULL || length < 2) { return; } for (int i = 1; i < length; i++) { for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { swap(arr, j, j + 1); } } } int main() { int a[5] = {31,1,3,5,7}; insertionSort(a,5); for (int i = 0; i < 5; i++) { printf("%d\n", a[i]); } return 0; }
|
以上的时间复杂度都为O(N^2^)
归并排序
归并排序是一种经典的分治算法,它的基本思想是将一个数组分成两个子数组,分别对子数组进行排序,然后将已排序的子数组合并成一个有序数组。这个过程递归地进行,直到整个数组有序。(时间复杂度为O(Nlogn))
下面是使用 C 语言实现的归并排序代码(递归):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include <stdio.h>
// 归并两个有序数组 void merge(int arr[], int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid;
// 创建临时数组来存储两个子数组 int leftArr[n1], rightArr[n2];
// 将数据复制到临时数组 leftArr[] 和 rightArr[] for (int i = 0; i < n1; i++) leftArr[i] = arr[left + i]; for (int j = 0; j < n2; j++) rightArr[j] = arr[mid + 1 + j];
// 归并两个子数组到 arr[left..right] int i = 0; // 初始化第一个子数组的索引 int j = 0; // 初始化第二个子数组的索引 int k = left; // 初始化归并后数组的索引
while (i < n1 && j < n2) { if (leftArr[i] <= rightArr[j]) { arr[k] = leftArr[i]; i++; } else { arr[k] = rightArr[j]; j++; } k++; }
// 将左侧剩余元素复制到 arr 中 while (i < n1) { arr[k] = leftArr[i]; i++; k++; }
// 将右侧剩余元素复制到 arr 中 while (j < n2) { arr[k] = rightArr[j]; j++; k++; } }
// 归并排序主函数 void mergeSort(int arr[], int left, int right) { if (left < right) { // 计算中间索引 int mid = left + (right - left) / 2;
// 递归地排序左右两半 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right);
// 合并已排序的子数组 merge(arr, left, mid, right); } }
int main() { int arr[] = {12, 11, 13, 5, 6, 7};
int arrSize = sizeof(arr) / sizeof(arr[0]);
printf("Original array: "); for (int i = 0; i < arrSize; i++) printf("%d ", arr[i]);
printf("\n");
// 调用归并排序函数 mergeSort(arr, 0, arrSize - 1);
printf("Sorted array: "); for (int i = 0; i < arrSize; i++) printf("%d ", arr[i]);
return 0; }
|