《 算法导论》上的几个排序算法。 1. 合并排序1(merge sort) #include <stdio.h> // printf#include <limits.h> // INT_MAX#include <stdlib.h> // systemvoid printArray(int A[], int size)...{ for(int i=0; i<size; ++i) ...{ printf("%d ", A[i]); } printf(" ");}void merge(int A[], int p, int q, int r)...{ int n1 = q - p + 1; int n2 = r - q; int i, j, k; // create arrays L[1...n1+1] and R[1..n2+1] int *L = new int[n1+1]; int *R = new int[n2+1]; for (i=0; i<n1; ++i) ...{ L[i] = A[p+i]; } for (j=0; j<n2; ++j) ...{ R[j] = A[q+1+j]; } // sentinel L[n1] = INT_MAX; R[n2] = INT_MAX; i = j = 0; for (k=p; k<r+1; ++k) ...{ if (L[i] < R[j]) ...{ A[k] = L[i]; ++i; } else ...{ A[k] = R[j]; ++j; } } delete [] L; delete [] R;}void merge_sort(int A[], int p, int r)...{ if (p<r) ...{ int q = (p + r)/2; merge_sort(A, p, q); merge_sort(A, q+1, r); merge(A, p, q, r); }}int main(int argc, char* argv[])...{ ...{ int A[] = ...{5, 2, 4, 6, 1, 3}; int size = sizeof(A)/sizeof(int); printArray(A, size); merge_sort(A, 0, size-1); printArray(A, size); } ...{ int A[] = ...{31, 41, 59, 26, 41, 58}; int size = sizeof(A)/sizeof(int); printArray(A, size); merge_sort(A, 0, size-1); printArray(A, size); } system("pause"); return 0;} 2. 合并排序2(merge sort) #include <stdio.h> // printf#include <limits.h> // INT_MAX#include <stdlib.h> // system// length that using insertion-sort const int K = 4;void printArray(int A[], int size)...{ for(int i=0; i<size; ++i) ...{ printf("%d ", A[i]); } printf(" ");}void insertion_sort(int A[], int p, int r)...{ for (int j = p+1; j < r+1; ++j) ...{ int key = A[j]; int i = j - 1; while (i>=p && A[i]>key) ...{ A[i+1] = A[i]; --i; } A[i+1] = key; }}void merge(int A[], int p, int q, int r)...{ int n1 = q - p + 1; int n2 = r - q; int i, j, k; // create arrays L[1...n1+1] and R[1..n2+1] int *L = new int[n1+1]; int *R = new int[n2+1]; for (i=0; i<n1; ++i) ...{ L[i] = A[p+i]; } for (j=0; j<n2; ++j) ...{ R[j] = A[q+1+j]; } // sentinel L[n1] = INT_MAX; R[n2] = INT_MAX; i = j = 0; for (k=p; k<r+1; ++k) ...{ if (L[i] < R[j]) ...{ A[k] = L[i]; ++i; } else ...{ A[k] = R[j]; ++j; } } delete [] L; delete [] R;}void merge_sort(int A[], int p, int r)...{ if (p < r) ...{ if (r - p < K) ...{ insertion_sort(A, p, r); } else ...{ int q = (p + r)/2; merge_sort(A, p, q); merge_sort(A, q+1, r); merge(A, p, q, r); } }}int main(int argc, char* argv[])...{ ...{ int A[] = ...{5, 2, 4, 6, 1, 3}; int size = sizeof(A)/sizeof(int); printArray(A, size); merge_sort(A, 0, size-1); printArray(A, size); } ...{ int A[] = ...{31, 41, 59, 26, 41, 58, 23, 45, 56, 77, 90, 12, 3, 32, 65, 73, 23, 42, 78}; int size = sizeof(A)/sizeof(int); printArray(A, size); merge_sort(A, 0, size-1); printArray(A, size); } system("pause"); return 0;} 3. 插入排序(insertion sort) #include <stdio.h> // printf#include <stdlib.h> // systemvoid printArray(int A[], int size)...{ for(int i=0; i<size; ++i) ...{ printf("%d ", A[i]); } printf(" ");}void insertion_sort(int *A, int size)...{ for (int j = 1; j < size; ++j) ...{ int key = A[j]; int i = j - 1; while (i>=0&&A[i]>key) ...{ A[i+1] = A[i]; --i; } A[i+1] = key; }}int main(int argc, char* argv[])...{ ...{ int A[] = ...{5, 2, 4, 6, 1, 3}; int size = sizeof(A)/sizeof(int); printArray(A, size); insertion_sort(A, size); printArray(A, size); } ...{ int A[] = ...{31, 41, 59, 26, 41, 58}; int size = sizeof(A)/sizeof(int); printArray(A, size); insertion_sort(A, size); printArray(A, size); } system("pause"); return 0;} 4. 堆排序(heap sort) #include <stdio.h> // printf#include <stdlib.h> // system#define PARENT(i) ((i-1)/2)#define LEFT(i) ((i)*2+1)#define RIGHT(i) ((i)*2 + 2)void max_heapify(int A[], int i, int size)...{ int l = LEFT(i); int r = RIGHT(i); int largest = i; if (l<size && A[l]>A[i]) ...{ largest = l; } if (r<size && A[r]>A[largest]) ...{ largest = r; } if (largest != i) ...{ int t = A[i]; A[i] = A[largest]; A[largest] = t; max_heapify(A, largest, size); }}void build_max_heap(int A[], int size)...{ for (int i = PARENT(size-1); i >=0; --i) ...{ max_heapify(A, i, size); }}void heap_sort(int A[], int size)...{ build_max_heap(A, size); for (int i = size -1; i>0; --i) ...{ int t = A[0]; A[0] = A[i]; A[i] = t; max_heapify(A, 0, i); }}void printArray(int A[], int size)...{ for(int i=0; i<size; ++i) ...{ printf("%d ", A[i]); } printf(" ");}int main()...{ ...{ int A[] = ...{5, 2, 4, 6, 1, 3}; int size = sizeof(A)/sizeof(int); printArray(A, size); heap_sort(A, size); printArray(A, size); } ...{ int A[] = ...{31, 41, 59, 26, 41, 58}; int size = sizeof(A)/sizeof(int); printArray(A, size); heap_sort(A, size); printArray(A, size); } ...{ int A[] = ...{5, 13, 2, 25, 7, 17, 20, 8, 4}; int size = sizeof(A)/sizeof(int); printArray(A, size); heap_sort(A, size); printArray(A, size); } system("pause"); return 0;} 5. 快速排序(quick sort) #include <stdio.h> // printf#include <stdlib.h> // systemint partition(int A[], int p, int r)...{ int x = A[r]; int i = p - 1; for(int j = p; j<r; ++j) ...{ if (A[j] <= x) ...{ ++i; int t = A[j]; A[j] = A[i]; A[i] = t; } } A[r] = A[i + 1]; A[i + 1] = x; return i + 1;}int hoare_partition(int A[], int p, int r)...{ int x = A[p]; int i = p - 1; int j = r + 1; while (1) ...{ do ...{ --j; } while(A[j] > x); do ...{ ++i; } while(A[i] <= x); // exchange A[i] and A[j] if (i < j) ...{ int t = A[i]; A[i] = A[j]; A[j] = t; continue; } else ...{ A[p] = A[j]; A[j] = x; return j; } }}void quick_sort(int A[], int p, int r)...{ if (p < r) ...{ int q = hoare_partition(A, p, r); quick_sort(A, p, q-1); quick_sort(A, q+1, r); }}void printArray(int A[], int size)...{ for(int i=0; i<size; ++i) ...{ printf("%d ", A[i]); } printf(" ");}int main(int argc, char *argv[])...{ ...{ int A[] = ...{5, 2, 4, 6, 1, 3}; int size = sizeof(A)/sizeof(int); printArray(A, size); quick_sort(A, 0, size - 1); printArray(A, size); } ...{ int A[] = ...{13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11}; int size = sizeof(A)/sizeof(int); printArray(A, size); quick_sort(A, 0, size - 1); printArray(A, size); } system("pause"); return 0;} 6. stooge排序 #include <stdio.h> // printf#include <stdlib.h> // systemvoid printArray(int A[], int size)...{ for(int i=0; i<size; ++i) ...{ printf("%d ", A[i]); } printf(" ");}void stooge_sort(int A[], int i, int j)...{ if (A[i] > A[j]) ...{ // exchange int t = A[i]; A[i] = A[j]; A[j] = t; } if (i+1>=j) return; int k = (j-i+1)/3; // Round down. stooge_sort(A, i, j - k); // First two-thirds. stooge_sort(A, i + k, j); // Last two-thirds. stooge_sort(A, i, j - k); // First two-thirds again.}int main(int argc, char* argv[])...{ ...{ int A[] = ...{31, 41, 59, 26, 41, 58, 23, 45, 56, 77, 90, 12, 3, 32, 65, 73, 23, 42, 78}; int size = sizeof(A)/sizeof(int); printArray(A, size); stooge_sort(A, 0, size-1); printArray(A, size); } system("pause"); return 0;}