七種內排序演算法C++實現
阿新 • • 發佈:2018-12-11
七種內排序演算法,目前只寫了程式碼,原理解析待補充:
1.交換類排序:冒泡、快排;
2.選擇類排序:選擇、堆排序;
3.插入類排序:直接插入、希爾;
4.歸併排序
測試用例:
5 1 2 4 3 -3 10 100 293 123 212 293 434 5 12 439 3
Todo:
原理、複雜度解析與穩定性解析。
#include<iostream> using namespace std; int n; //print current array void echo(int a[]) { if (a==nullptr || n <= 0) { cout << "null error" << endl; return; } for (int i = 0; i < n-1; i++) { cout << a[i] << " "; } cout << a[n - 1] << endl; } //swap a[i] and a[j] void swap(int a[], int i, int j) { if (a[i] == a[j]) { return; } a[i] ^= a[j]; a[j] ^= a[i]; a[i] ^= a[j]; } //1.Bubble Sort void BubbleSort(int a[]) { if (a == nullptr) { return; } int flag = 1; for (int i = 0; i < n-1 && flag; i++) { flag = 0; for (int j = 0; j < n - i - 1; j++) { if (a[j]>a[j+1]) { flag = 1; swap(a,j,j+1); echo(a); } } } } //2.Quick Sort void QuickSort(int a[], int left, int right) { if (a == nullptr || left >= right) { return; } int i = left, j = right; int tmp = a[i]; while (i<j) { while (i < j && tmp <= a[j]) { --j; } if (i<j) { a[i] = a[j]; } while (i<j && a[i] <= tmp) { ++i; } if (i<j) { a[j] = a[i]; } } a[i] = tmp; echo(a); QuickSort(a, left, i - 1); QuickSort(a, i + 1, right); } //3.Select Sort void SelectSort(int a[]) { for (int i = 0; i < n - 1; i++) { int maxi = 0; for (int j = 0; j < n - i; j++) { if (a[j]>a[maxi]) { maxi = j; } } swap(a, n - i - 1, maxi); echo(a); } } //4.Heap Sort void AdjustHeap(int a[], int i, int last) { int left = 2 * i + 1, right = 2 * i + 2, tmp = a[i]; while (left<last) { int maxi = left; if (right<last && a[left] < a[right]) { maxi = right; } if (tmp < a[maxi]) { a[i] = a[maxi]; i=maxi; left = 2 * i + 1, right = 2 * i + 2; echo(a); } else { break; } } a[i] = tmp; } void InitHeap(int a[]) { int t = (n - 1) / 2; for (; t >= 0; t--) { AdjustHeap(a, t, n); } cout << "heap init done." << endl; } void HeapSort(int a[]) { InitHeap(a); for (int i = 0; i < n - 1; i++) { AdjustHeap(a, 0, n - i); swap(a, 0, n - i - 1); echo(a); } } //5.Insert Sort void InsertSort(int a[]) { for (int i = 1; i < n; i++) { int tmp = a[i], j = i - 1; while (j >= 0 && a[j]>tmp) { a[j + 1] = a[j]; --j; } a[j + 1] = tmp; echo(a); } } //6.Shell Sort void ShellSort(int a[]) { for (int pace = n/2; pace >= 1; pace/=2) { for (int i = pace; i < n; i++) { int tmp = a[i]; int j = i; while (j>=pace && tmp<a[j-pace]) { a[j] = a[j - pace]; j -= pace; } a[j] = tmp; echo(a); } } } //7.Merge Sort void merge(int a[], int left, int mid, int right) { if (a == nullptr || left > mid || mid > right) { return; } int i = left, j = mid + 1, len = right - left + 1; int* tmpMerge = new int[len]{ 0 }; int k = 0; while (i<=mid && j<=right) { if (a[i] < a[j]) { tmpMerge[k++] = a[i++]; } else { tmpMerge[k++] = a[j++]; } } while (i <= mid) { tmpMerge[k++] = a[i++]; } while (j <= right) { tmpMerge[k++] = a[j++]; } memcpy(&a[left], tmpMerge, len * sizeof(int)); delete[] tmpMerge; } void MergeSort(int a[], int left, int right) { if (a == nullptr || left >= right) { return; } int mid = (left + right) / 2; MergeSort(a, left, mid); MergeSort(a, mid + 1, right); merge(a, left, mid, right); echo(a); } int main() { cout << "Input numbers of array: "; while (cin>>n) { int* a = new int[n]; cout << "Input array: "; for (int i = 0; i < n; i++) { cin >> a[i]; } int* tmp = new int[n]; memcpy(tmp, a, n * sizeof(int)); cout << "Bubble Sort:" << endl; echo(a); BubbleSort(a); memcpy(a, tmp, n * sizeof(int)); cout << "Quick Sort:" << endl; echo(a); QuickSort(a, 0, n - 1); memcpy(a, tmp, n * sizeof(int)); cout << "Select Sort:" << endl; echo(a); SelectSort(a); memcpy(a, tmp, n * sizeof(int)); cout << "Heap Sort:" << endl; echo(a); HeapSort(a); memcpy(a, tmp, n * sizeof(int)); cout << "Insert Sort:" << endl; echo(a); InsertSort(a); memcpy(a, tmp, n * sizeof(int)); cout << "Shell Sort:" << endl; echo(a); ShellSort(a); memcpy(a, tmp, n * sizeof(int)); cout << "Merge Sort:" << endl; echo(a); MergeSort(a, 0, n - 1); delete[] tmp; delete[] a; cout << endl << "Input numbers of array: "; } return 0; }