常见的排序算法
来源:互联网 发布:mac 充电 过热 编辑:程序博客网 时间:2024/05/21 08:04
#include <iostream>void dataSwap(int* a, int* b);void Bubble_Sort(int* arr, int len);void Insert_Sort(int* arr, int len);void Selection_Sort(int* arr, int len);void MergeS(int* arr, int low, int mid, int high, int* temp);void Merge_Sort(int* arr, int low, int high, int* temp);int Partition(int* arr, int iBegin, int iEnd);void QuickSort(int* arr, int iBegin, int iEnd);using namespace std;int main(){ int arr[10] = {34, 1, 4, 6, 32, 0, 78, 3, 9, 100}; cout << "排序前: "; for (int i = 0; i < 10; i++) cout << arr[i] << " "; cout << endl; // Bubble_Sort(arr, 10); // Insert_Sort(arr, 10); // Selection_Sort(arr, 10); int* temp = new int[sizeof(arr)/sizeof(arr[0])]; Merge_Sort(arr, 0, 9, temp); delete [] temp; temp = NULL; // QuickSort(arr, iBegin, iEnd); cout << "排序后: "; for (int i = 0; i < 10; i++) cout << arr[i] << " "; cout << endl; return 0;}void dataSwap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp;}// 冒泡排序,将最大的放大最后// 时间复杂度: O(n^2)// 空间复杂度: O(1)// 稳定排序void Bubble_Sort(int* arr, int len){ for (int i = 0; i < len - 1; i++) { for (int j = 0 ; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]) dataSwap(&arr[j], &arr[j+1]); } }}// 插入排序// 时间复杂度与逆序对相关,最优时间复杂度为O(n),最差时间复杂度为O(n^2) (1+2+...+n-1=n(n-1)/2)// 空间复杂度:O(1)// 稳定排序void Insert_Sort(int* arr, int len){ int i,j; for (i = 1; i < len; i++) { int key = arr[i]; for (j = i - 1; j >= 0; j--) { if (arr[j] > key) arr[j+1] = arr[j]; else break; } arr[j+1] = key; // 这儿犯过错,把j+1写为j++,造成数组中的元素被其他元素覆盖 }}// 选择排序,选出最小的放在最前面// 时间复杂度:O(n^2)// 空间复杂度:O(1)// 不稳定的排序算法:例如 5,5,3,会将第一个5放在第二个5的后面void Selection_Sort(int* arr, int len){ int i,j; for (i = 0; i < len-1; i++) // 注意只到倒数第二个 { int index = i; int min_val = arr[i]; for (j = i+1; j < len; j++) { if (arr[j] < min_val) { index = j; min_val = arr[j]; } } if (i != index) dataSwap(&arr[i], &arr[index]); }}// 归并排序// 时间复杂度:O(nlogn)// 综上所述:快速排序最差的情况下时间复杂度为:O( n^2 )// 空间复杂度:O(n) 递归调用返回值使用栈// 稳定排序void Merge_Sort(int* arr, int low, int high, int* temp){ if (low < high) { int mid = (low+high)/2; Merge_Sort(arr, low, mid, temp); Merge_Sort(arr, mid+1, high, temp); MergeS(arr, low, mid, high, temp); }}void MergeS(int* arr, int low, int mid, int high, int* temp){ int i = low; int j = mid+1; int k = 0; while(i <= mid && j <= high) { if (arr[i] <= arr[j]) temp[k++] = arr[i++]; else temp[k++] = arr[j++]; } while (i <= mid) temp[k++] = arr[i++]; while (j <= high) temp[k++] = arr[j++]; for (i = 0 ; i < k; i++) arr[low+i] = temp[i];}// 快速排序// 平均时间复杂度:O(nlogn)// 最差的情况:所有元素有序时,每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序)// 这种情况时间复杂度就好计算了,就是冒泡排序的时间复杂度:T[n] = n * (n-1) = n^2 + n;// 综上所述:快速排序最差的情况下时间复杂度为:O( n^2 )// 最优空间复杂度:O(logn) 递归调用返回值使用栈// 最差空间复杂度:O(n)// 不稳定排序int Partition(int* arr, int iBegin, int iEnd){ int key = arr[iBegin]; while (iBegin < iEnd) { while (iBegin < iEnd && arr[iEnd] >= key) // 从尾部找比第一个数小的数 iEnd--; if (iBegin != iEnd) { arr[iBegin] = arr[iEnd]; iBegin++; while (iBegin < iEnd && arr[iBegin] <= key) // 从第一个数后面开始找比第一个数大的数 iBegin++; if (iBegin != iEnd) { arr[iEnd] = arr[iBegin]; iEnd--; } } } arr[iEnd] = key; return iEnd;}void QuickSort(int* arr, int iBegin, int iEnd){ if (iBegin < iEnd) { int pos = Partition(arr, iBegin, iEnd); QuickSort(arr, iBegin, pos-1); QuickSort(arr, pos+1, iEnd); }}// 堆排序
阅读全文
0 0
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 常见的排序算法
- 如何在字符串中加双引号
- H5轻松实现跨终端,跨平台
- echarts 调整图表大小的方法
- SAP CLIENT COPY
- Opencv->罗德里格斯(Rodrigues)变换
- 常见的排序算法
- angular判断数据类型
- 类内给出函数主体和类外给出成员函数主体区别
- 50道Java线程面试题
- js Array.prototype.map()使用实例
- 【AI系统首次实现真正自主编程】利用遗传算法,完爆初级程序员
- 递归实现冒泡排序
- 都在说微服务,那么微服务的反模式和陷阱是什么(三)
- 《Windows核心编程》读书笔记七 线程调度,优先级和关联性