七种内排序算法,目前只写了代码,原理解析待补充:
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; }
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/116743.html