快速排序与堆排序
来源:互联网 发布:ipone卡通贴图软件 编辑:程序博客网 时间:2024/06/05 15:44
快速排序:
稳定的排序,总是将首元素当作枢轴元素,将数组进行划分,然后递归调用,时间复杂度
为nlogn;
#include <iostream>using namespace std;template<typename T>void quickSort(T *array, int n){if(n<=1)return;T *minArray = new T[n];T *maxArray= new T[n];T *equalArray = new T[n];int mi=0,ma=0,me=0;for(int i=0; i<n; i++){if(array[i]<array[0])minArray[mi++] = array[i];else if(array[i]==array[0])equalArray[me++] = array[i];elsemaxArray[ma++] = array[i];}if(mi>1)quickSort<T>(minArray,mi);if(ma>1)quickSort<T>(maxArray,ma);int j=0;for(int i=0; i<mi; i++){array[j++] = minArray[i];}for(int i=0; i<me; i++){array[j++] = equalArray[i];}for(int i=0; i<ma; i++){array[j++] = maxArray[i];}delete[] minArray;delete[] equalArray;delete[] maxArray;}#include <cstdlib>#include <ctime>int main(){int n;while(cin>>n){double *array = new double[n];srand(time(NULL));for(int i=0; i<n; i++){//cin>>array[i];array[i] = rand() % 100;cout << array[i] << " ";}quickSort<double>(array,n);cout << endl;for(int i=0; i<n; i++)cout << array[i] << " ";cout << endl;delete[] array;}return 0;}
堆排序:
不是稳定的排序,不适合小样本集,时间复杂度是nlogn;
#include <iostream>#include <cstdlib>#include <ctime>using namespace std;template<typename T>void swapM(T &a, T &b){T tmp = a;a = b;b = tmp;}template<typename T>void heapify(T *A, int i, int n){int l = 2*i; // 左儿子int r = 2*i+1; // 右儿子int largest;if (l <= n && A[l] > A[i] )largest = l;elselargest = i;if(r <= n && A[r] > A[largest])largest = r;if( largest != i){swapM<T>(A[i],A[largest]);heapify<T>(A,largest,n);}}// construct a minimum heaptemplate<typename T>void buildHeap(T *A, int n){for(int i=n/2; i>=1; i--) // i>n/2 是叶子节点,不需要调整heapify<T>(A,i,n);}template<typename T>void heapSort(T *A, int n){buildHeap(A,n); // <----> buildHeap<T>(A,n);int size = n;for(int i=n; i>=2; i--){swapM<T>(A[1],A[i]); // 总数将根部元素与尾部元素交换size -= 1;heapify<T>(A,1,size); // 从剩余元素中获取最大值到根部}}int main(){int n;while(cin>>n){srand(time(NULL));double *heap = new double[n+1];for(int i=1; i<=n; i++)heap[i] = rand()%100;for(int i=1; i<=n; i++)cout << heap[i] << " ";cout << endl;heapSort<double>(heap,n);for(int i=1; i<=n; i++)cout << heap[i] << " ";cout << endl;}return 0;}
阅读全文
0 0
- 堆排序与快速排序
- 堆排序 与 快速排序
- 快速排序与堆排序
- 堆排序与快速排序效率比较
- 快速排序与堆排序 C++实现
- 快速排序与堆排序的实现
- 快速排序/堆排序
- 常用排序算法之堆排序与快速排序
- 【算法】堆排、快速与归并排序
- 快速排序和堆排序
- 快速排序,堆排序解析
- 堆排序和快速排序
- 堆排序和快速排序
- 快速排序和堆排序
- 快速排序和堆排序
- 快速排序VS堆排序
- 快速排序与堆排序效率对比(TimeSpan计时)
- 快速排序与堆排序的Java实现(泛型)
- 原生js仿jquery一些常用方法
- JS判断UA
- 【bzoj4636】蒟蒻的数列
- ConstraintLayout布局 居中|居右 实现。
- 数颜色 (二分查找 主席树)
- 快速排序与堆排序
- C++风格_列表初始化
- 索引的基本概念、分类、优点、使用
- activemq 关于死信队列的配置应用
- html中article、section、aside的区别与联系
- 使用 PHP 直接在共享内存中存储数据集
- pandas使用技巧
- Spring MVC框架的搭建
- 各种浏览器的Hack写法(chrome firefox ie等)