voidswap(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
intfind_max_index(int arr[], int n) { int max_pos = 0; int max = arr[0]; for (int i = 0; i < n; i++) { if (arr[i] > max) { max = arr[i]; max_pos = i; } } return max_pos; }
voidselection_sort(int arr, int n) { while (n > 1) { int max_pos = find_max_index(arr, n); swap(arr, max_pos, n - 1); n--; } }
intmain() { int arr[] = {1, 3, 2, 4, 0, 1, 2}; int n = sizeof(arr) / sizeof(arr[0]); selection_sort(arr, n); for (int i = 0; i < n; i++) { printf("%d\n", arr[i]); } return0; }
voidheapify(int arr[], int i, int n) { if (i >= n) { return; } int c1 = 2 * i + 1; int c2 = 2 * i + 2; int max = i; // for c1 < n means that child must not out of range of this tree if (c1 < n && arr[c1] > arr[max]) { max = c1; } if (c2 < n && arr[c2] > arr[max]) { max = c2; } if (max != i) { swap(arr, max, i); // continue to heapify, make it a big tree heapify(arr, max, n); } }
voidbuild_tree(int arr[], int n) { int last_node = n - 1; int parent = (last_node - 1) / 2; for (int i = parent; i >= 0; i--) { heapify(arr, i, n); } }
voidheap_sort(int arr[], int n) { build_tree(arr, n); for (int i = n - 1; i >= 0; i--) { swap(arr, 0, i); heapify(arr, 0, i); } }
intmain() { int arr[] = {1, 3, 2, 4, 0, 1, 2}; int n = sizeof(arr) / sizeof(arr[0]); heap_sort(arr, n); for (int i = 0; i < n; i++) { printf("%d\n", arr[i]); } return0; }
voidmerge(int arr, int r, int m, int l) { int left_size = m - r; int right_size = l - m + 1; int left[left_size]; int right[right_size]; int i, j, k; // fill left and right sub array for (i = l; i < m; i++) { left[i - l] = arr[i]; } for (i = m; i <= r; i++) { right[i - m] = arr[i]; } // i is index for left array, and j is for right here // k is index of complete array while (i < left_size && j < right_size) { if (left[i] < right[j]) { arr[k++] = left[i++]; } else { arr[k++] = right[j++]; } } // if one of left and right arrays finish // and then the other one will fill the back while (i < left_size) { arr[k++] = left[i++]; } while (j < right_size) { arr[k++] = right[j++]; } }
voidmerge_sort(int arr[], int l, int r) { // flag for recursion compeleting if (l == r){ return; } int m = (r + l) / 2; merge_sort(arr, l, m); merge_sort(arr, m + 1, r); merge(arr, l, m, r); }
intmain() { int arr[] = {1, 3, 2, 4, 0, 1, 2}; int n = sizeof(arr) / sizeof(arr[0]); merge_sort(arr, 0, n); for (int i = 0; i < n; i++) { printf("%d\n", arr[i]); } return0; }
voidswap(int arr[], int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
intpartition(int arr[], int low, int high) { int i = low - 1; int pivot = arr[high]; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; swap(arr, i, j); } } swap(arr, i + 1, high); return i + 1; }
voidquick_sort(int arr[], int low, int high) { if (low < high) { int p = partition(arr, low, high); quick_sort(arr, low, p - 1); quick_sort(arr, p + 1, high); } }
intmain() { int arr[] = {1, 3, 2, 4, 0, 1, 2}; int n = sizeof(arr) / sizeof(arr[0]); quick_sort(arr, 0, n); for (int i = 0; i < high; i++) { printf("%d\n", arr[i]); } return0; }
总结
以上的各种排序算法, 实际上全是通过元素的比较与交换进行. 所以在进行排序的过程就是进行比较的过程
使用c语言的主要目的是, c语言比较简单, 所有的语句都要自己写, 更能使读者方便.
以上使用的全部是最通俗的c语言, 没有使用指针以及引用类型
以下是swap的引用类型写法, 使得swap的函数可读性更强.
1 2 3 4 5
voidswap(int &a, int &b) { int temp = &a; &a = &b; &b = temp; }