考研資料結構——排序,演算法程式碼部分
阿新 • • 發佈:2018-12-20
#include<iostream> using namespace std; int main() { return 0; } //直接插入排序 void insertSort(int arr[], int n) { int temp, i, j; for (i = 0; i < n; i++) { temp = arr[i]; j = i - 1; while (j>=0&&temp<arr[j]) { arr[j + 1] = arr[j]; --j; } arr[j + 1] = temp; } } //簡單選擇排序 void selectSort(int arr[], int n) { int i, j, k; int temp; for ( i = 0; i < n; i++) { k = i; for (j = i + 1; j < n;++j) if (arr[k]>arr[j]) k = j; temp = arr[i]; arr[i] = arr[k]; arr[k] = temp; } } //氣泡排序 void bubleSort(int arr[], int n) { int i, j, flag; int temp; for ( i = n-1; i >=1; --i) { flag = 0; for ( j = 1; j <= i; j++) { if (arr[j-1]>arr[j]) { temp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = temp; flag = 1; } } if (flag = 0) return; } } //希爾排序 void shellSort(int arr[], int n) { int temp; //設定不斷減半的增量 for (int gap = n/2; gap >0; gap/=2) { //i的作用是選出無序序列的一個關鍵字並將其插入到有序序列中 for (int i = gap; i < n; ++i) { temp = arr[i]; int j; for (j = i; j >= gap && arr[j - gap]>temp; j -= gap) arr[j] = arr[j - gap]; arr[j] = temp; } } //最後gap = 1時,就成為了直接插入排序 } //快速排序 void quicksort(int arr[], int low, int high) { int temp; int i = low, j = high; if (low<high) { temp = arr[low]; while (i<j) { while (j>i&&arr[j] >= temp) --j; if (i < j) { arr[i] = arr[j]; ++i; } while (i < j&&arr[i] < temp) ++i; if (i<j) { arr[j] = arr[i]; --j; } } arr[i] = temp; quicksort(arr, low, i - 1); quicksort(arr, i + 1, high); } } //堆排序實現程式碼 //調整順序函式 void sift(int arr[], int low, int high) { int i = low, j = 2 * i + 1; int temp = arr[i]; while (j <= high) { if (j < high && arr[j] < arr[j + 1]) ++j; if (temp < arr[j]) { arr[i] = arr[j]; i = j; j = 2 * i + 1; } else break; } arr[i] = temp; } //建堆函式 void heapSort(int arr[], int n) { int i; int temp; for (i = n / 2 - 1; i >= 0; --i) sift(arr, i, n - 1); for (i = n - 1; i > 0; --i) { temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; sift(arr, 0, i - 1); } } //歸併排序 //主函式 void mergeSort(int arr[], int low, int high) { if (low < high) { int mid = (low + high) / 2; mergeSort(arr, low, mid); mergeSort(arr, mid + 1, high); merge(arr, low, mid, high); } } //排序函式 void merge(int arr[], int low, int mid, int high) { int i, j, k; int n1 = mid - low + i; int n2 = high - mid; //VS編譯器要求表示式必須具有常量值,先用數字代替 //int L[n1], R[n2]; int L[50], R[50]; for (i = 0; i < n1; i++) L[i] = arr[low + i]; for (j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; i = 0; j = 0; k = low; while (i<n1 && j<n2) { if (L[i] <= R[j]) arr[k] = L[i++]; else arr[k] = R[j++]; k++; } while (i < n1) arr[k++] = L[i++]; while (j < n2) arr[k++] = R[j++]; }