登 录
#include <iostream> #define LENGTH 10 #define MAXVALUE ~(~1<<30) using namespace std; int A[LENGTH] = {16, 4, 10, 14, 7, 9, 3, 2, 8, 1}; /* ===========================插入排序============================================== */ /* * 插入排序 */ void insertion_sort(int *A, int length) { for (int j = 1; j < length; j++) { int key = A[j]; /* 抽出第j张牌 */ /* Insert A[j] into the sorted sequence A[0...j-1] */ int i = j-1; while (i >= 0 && A[i] > key) { /* 如果第i张牌比抽出的牌大,将其后移 */ A[i+1] = A[i]; i--; } A[i+1] = key; } } /* ===========================插入排序结束============================================ */ /* ===========================两路合并排序========================================= */ /* * 合并两个已排序好的子数组A[p...q]和A[q+1...r] */ void merge(int *A, int p, int q, int r) { int n1 = q-p+1; int n2 = r-q; int *L = new int[n1+1]; int *R = new int[n2+1]; for (int i = 0; i < n1; i++) L[i] = A[p+i]; for (int j = 0; j < n2; j++) R[j] = A[q+1+j]; L[n1] = MAXVALUE; R[n2] = MAXVALUE; int x = 0, y = 0; for (int k = p; k <= r; k++) { if (L[x] <= R[y]) { A[k] = L[x]; x++; } else { A[k] = R[y]; y++; } } } /* * 两路合并排序 */ 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); } } /* ===========================两路合并排序结束========================================== */ /* ===========================冒泡法序============================================ */ /* * 冒泡法排序 */ void bubble_sort(int *A, int length) { for (int i = 0; i < length; i++) for (int j = length-1; j >i; j--) if (A[j] < A[j-1]) { int temp = A[j]; A[j] = A[j-1]; A[j-1] = temp; } } /* ===========================冒泡法序结束========================================== */ /* ===========================堆排序=========================================== */ /* * 使以i为根的子树成为最大堆 */ void max_heapify(int *A, int k, int n) { int i = k; int key = A[i]; int larger = 2*i+1; /* 顶点i的大孩子 */ while (larger < n) { if (larger+1 < n && A[larger+1] > A[larger]) larger++; /* 如果存在右孩子且比左孩子大 */ if (key > A[larger]) break; A[i] = A[larger]; i = larger; larger = 2*i+1; } A[(larger-1)/2] = key; } /* * 建堆 */ void build_max_heap(int *A, int n) { for (int i = n/2-1; i >= 0; i--) { /* A[n/2]到A[n]都是叶子节点,所以从A[n/2-1]开始知道A[1] */ max_heapify(A, i, n); } } /* * 堆排序 */ void heap_sort(int *A, int n) { int temp; build_max_heap(A, n); for (int i = n-1; i > 0; i--) { /* 当i==0时排序完成,所以取i > 0而不是i >= 0 */ temp = A[i]; A[i] = A[0]; A[0] = temp; max_heapify(A, 0, i); } } /* ===========================堆排序结束========================================= */ /* ===========================快速排序======================================== */ /* * 快速排序的partion过程 */ int partition(int *A, int p, int r) { int i = p - 1; /* 小于等于A[r]的最后一个元素 */ int temp; for (int j = p; j < r; j++) { /* 扫描A[p]到A[r-1] */ if (A[j] <= A[r]) { /* 交换A[j]和A[i+1]*/ i++; temp = A[i]; A[i] = A[j]; A[j] = temp; } } temp = A[i+1]; A[i+1] = A[r]; A[r] = temp; return i+1; } /* * 快速排序 */ void quick_sort(int *A, int p, int r) { static int q; if (p < r) { q = partition(A, p, r); quick_sort(A, p, q-1); quick_sort(A, q+1, r); } } /* ===========================快速排序结束=========================================== */ int main() { // insertion_sort(A, LENGTH); // merge_sort(A, 0, LENGTH-1); // bubble_sort(A, LENGTH); // heap_sort(A, LENGTH); // quick_sort(A, 0, LENGTH); for (int i = 0; i < LENGTH; i++) { cout<<A[i]<<" "; } cout<<endl; getchar(); return 0; }
抱歉!评论已关闭.