内部排序选择、冒泡、插入、希尔、快速、归并、堆排序原理概要和实现
目錄
?
一、選擇排序
二、冒泡排序
三、插入排序
四、希爾排序
五、快速排序
六、歸并排序
七、堆排序
八、代碼和調(diào)用
?
一、選擇排序
? ? ?在線性表中,分為排好序的前一部分V和還未排好序U的后一部分,剛開始整個(gè)線性表都是未排好序的。選擇排序就是在未排好序U集合的部分每次選擇最小值換到最前面。然后納入集合V。
二、冒泡排序
? ? 冒泡排序,每次排序比較連續(xù)兩個(gè)相鄰的元素,小的交換到前面,大的交換交換到后面,達(dá)到每次排序小元素“浮"數(shù)組前面或大元素"沉"到數(shù)組后面的過(guò)程。
三、插入排序
? ? ?插入排序,分為排好序的前一部分V和還未排好序U的后一部分。從 i=1 開始和 第0個(gè)元素比較,如果已經(jīng)排號(hào)序的集合中要比 被比較元素 大,那么往后挪一個(gè)位置,最后把被比較元素放在率先比自己小的元素之后。
四、希爾排序
? ? ?即帶有步長(zhǎng)的插入排序。最后一次排序的步長(zhǎng)必然是1.加入設(shè) 步長(zhǎng)集合分別為{4,3,1}.代碼 原始線性表中每相互間隔為4的元素進(jìn)行插入排序一次.之后,原始線性表中每相互間隔為3的元素進(jìn)行插入排序一次,最后原始線性表中每相互間隔為1的元素進(jìn)行插入排序一次。一般插入排序?qū)嶋H上也就是步長(zhǎng)為1的希爾排序。由于插入排序在順序集合中的時(shí)間復(fù)雜度能達(dá)到 O(n).所以希爾排序就是盡可能的讓子集合進(jìn)行順序排好序。如果步長(zhǎng)集合設(shè)置的合適步長(zhǎng) 希爾排序的時(shí)間復(fù)雜度可以降低為?O(n(log n)^2?)。
五、快速排序
? ? 快速排序,每次排序把待排序元素放入到它的最終位置,并且,它的右側(cè)有比它大,左側(cè)都比它小的目的。
具體操作步驟就是 確定好待比較元素后,如果遍歷從后往前開始,那么當(dāng)遍歷到元素比待比較元素小時(shí)進(jìn)行交換,接著從交換位置開始從前往后遍歷。如果此時(shí)遍歷到元素比待比較元素大時(shí),進(jìn)行交換.反復(fù)遍歷,最后確認(rèn)好自身位置。
第二次排序時(shí),只要對(duì)上一次確定好位置的元素,左邊集合和右邊集合分別進(jìn)行快排就行。
六、歸并排序
? ? 把剛開始元素各自立為一個(gè)集合,每個(gè)集合都可以已經(jīng)排好序的集合。接著集合兩兩合并,通過(guò)比較兩個(gè)集合中的"頭"元素,把小的元素移值新合并到新的空間中成為一個(gè)新的集合。不斷合并最后合并成一個(gè)大集合。
七、堆排序
? ?構(gòu)建從小到大排序的線性表,需要構(gòu)建一個(gè)"大頂堆",實(shí)際上就是每個(gè)父節(jié)點(diǎn)都要比子節(jié)點(diǎn)大的完全二叉樹。對(duì)于線性表[0...length] ,按層次映射到完全二叉樹中,第n個(gè)元素的左孩子2n+1個(gè)元素,右孩子第2n+2個(gè)元素。
調(diào)整成”大頂"步驟如下,兩個(gè)孩子選出大的孩子,然后和父節(jié)點(diǎn)比較如果子節(jié)點(diǎn)和父節(jié)點(diǎn)大,那么交換。接著和孩子比較,直到比較到葉子節(jié)點(diǎn)。在完全二叉樹[0....length]中,最后一個(gè)非葉子節(jié)點(diǎn)的位置是,floor(heaplen/2)-1 。
操作步驟如下。
首先把亂序數(shù)組調(diào)成大頂堆。從??floor(heaplen/2)-1? 到 0 進(jìn)行調(diào)整。
當(dāng)調(diào)整成大頂堆時(shí),堆頂元素和最后一個(gè)元素進(jìn)行交換,把推頂大元素弄到數(shù)組后邊去。然后調(diào)整推頂節(jié)點(diǎn)即可。
八、代碼和調(diào)用
?
hpp
// // Created by Administrator on 2020/11/2. //#ifndef SMARTDONGLIB_SORT_H #define SMARTDONGLIB_SORT_H #include "const.h" #include <vector> //#include<cstring> #include <iostream>namespace SmartDongLib{class Sort{public:enum sortMethod {SelectionSort =1,BubbleSort ,InsertionSort,ShellSort,QuickSort,MergingSort=6,HeapSort};template<class _tp,class _RandomAccessIterator , class _Compare>static void sort(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp ,sortMethod method=QuickSort){switch (method) {case SelectionSort:selectionSort(_first,_last,_comp);break;case BubbleSort:bubbleSort(_first,_last,_comp);break;case InsertionSort:insertionSort(_first,_last,_comp);break;case ShellSort:shellSort(_first,_last,_comp);break;case QuickSort:quickSort(_first,_last-1,_comp);break;case MergingSort:mergingSort<_tp>(_first,_last,_comp);case HeapSort:heapSort(_first,_last,_comp);default:quickSort(_first,_last-1,_comp);break;}}template<class _tp,class _RandomAccessIterator>static void sort(_RandomAccessIterator _first, _RandomAccessIterator _last,sortMethod method=QuickSort){switch (method) {case SelectionSort:selectionSort(_first,_last);break;case BubbleSort:bubbleSort(_first,_last);break;case InsertionSort:insertionSort(_first,_last);break;case ShellSort:shellSort(_first,_last);break;case QuickSort:quickSort(_first,_last-1);break;case MergingSort:mergingSort<_tp>(_first,_last);case HeapSort:heapSort(_first,_last);default:quickSort(_first,_last-1);break;}}protected:/*** <p>堆排序.每次選擇最值放到子節(jié)點(diǎn)前* @tparam _RandomAccessIterator 線性表地址類型* @tparam _Compare 比較函數(shù)類型* @param _first 線性表起始地址* @param _last 線性表結(jié)束地址* @param _comp 比較函數(shù)*/template< class _RandomAccessIterator, class _Compare>static void heapSort(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp ){int heaplen =_last - _first;//把無(wú)序堆建立成有序堆,從最后一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn) heaplen -1,堆的一半開始調(diào)整for (int i = heaplen/2 -1 ; i >= 0 ; --i) {HeapAdjust(_first,i,heaplen-1,_comp);}//有序堆,每次調(diào)整后堆頂和最后一元素交換。for (int j = heaplen-1; j >0 ; --j) {iteratorSwap(_first,_first+j);HeapAdjust(_first,0,j-1,_comp);}}template< class _RandomAccessIterator >static void heapSort(_RandomAccessIterator _first, _RandomAccessIterator _last ){int heaplen =_last - _first;//把無(wú)序堆建立成有序堆,從最后一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn) heaplen -1,堆的一半開始調(diào)整for (int i = heaplen/2 -1 ; i >= 0 ; --i) {HeapAdjust(_first,i,heaplen-1);}//有序堆,每次調(diào)整后堆頂和最后一元素交換。for (int j = heaplen-1; j >0 ; --j) {iteratorSwap(_first,_first+j);HeapAdjust(_first,0,j-1);}}/*** <p>歸并排序.每次選擇最值放到最前面* @tparam _RandomAccessIterator 線性表地址類型* @tparam _Compare 比較函數(shù)類型* @param _first 線性表起始地址* @param _last 線性表結(jié)束地址* @param _comp 比較函數(shù)*/template<class _tp,class _RandomAccessIterator, class _Compare>static void mergingSort(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp ){Size len = _last -_first;_tp temp[len];Sort::mergeSort(_first,temp,0,len-1,_comp);}template<class _tp,class _RandomAccessIterator>static void mergingSort(_RandomAccessIterator _first, _RandomAccessIterator _last){Size len = _last -_first;_tp temp[len];Sort::mergeSort(_first,temp,0,len-1);}/*** <p>選擇排序.每次選擇最值放到最前面* @tparam _RandomAccessIterator 線性表地址類型* @tparam _Compare 比較函數(shù)類型* @param _first 線性表起始地址* @param _last 線性表結(jié)束地址* @param _comp 比較函數(shù)*/template<class _RandomAccessIterator, class _Compare>static void selectionSort(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp ){for (_RandomAccessIterator iter = _first ; iter < _last ;iter++){_RandomAccessIterator maxValue = iter;for (_RandomAccessIterator index= iter; index < _last; ++index) {if ( _comp (*index,*maxValue) ){maxValue=index;}}iteratorSwap(maxValue,iter);}}template<class _RandomAccessIterator>static void selectionSort(_RandomAccessIterator _first, _RandomAccessIterator _last){for (_RandomAccessIterator iter = _first ; iter < _last ;iter++){_RandomAccessIterator maxValue = iter;for (_RandomAccessIterator index= iter; index < _last; ++index) {if (*index<*maxValue ){maxValue=index;}}iteratorSwap(maxValue,iter);}}/*** <p> 冒泡排序。每次雙循環(huán)把最值交換到最前面* @tparam _RandomAccessIterator 線性表地址類型* @tparam _Compare 比較函數(shù)類型* @param _first 線性表起始地址* @param _last 線性表結(jié)束地址* @param _comp 比較函數(shù)*/template<class _RandomAccessIterator, class _Compare>static void bubbleSort(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp ){for (_RandomAccessIterator iter = _last ; iter > _first+1 ;iter--){for (_RandomAccessIterator index= _first; index < iter -1; ++index) {if ( _comp (*(index +1),*index) ){iteratorSwap(index,index +1);}}}}template<class _RandomAccessIterator>static void bubbleSort(_RandomAccessIterator _first, _RandomAccessIterator _last){for (_RandomAccessIterator iter = _last ; iter > _first+1 ;iter--){for (_RandomAccessIterator index= _first; index < iter -1; ++index) {if ( *(index +1)<*index ){iteratorSwap(index,index +1);}}}}/*** <p> 直接插入排序。每次雙循環(huán)i次表示前 i-1 個(gè)數(shù)都已經(jīng)排好序。* @tparam _RandomAccessIterator 線性表地址類型* @tparam _Compare 比較函數(shù)類型* @param _first 線性表起始地址* @param _last 線性表結(jié)束地址* @param _comp 比較函數(shù)*/template<class _RandomAccessIterator, class _Compare>static void insertionSort(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp ){singleShellInsert(_first,_last,_comp,1);}template<class _RandomAccessIterator>static void insertionSort(_RandomAccessIterator _first, _RandomAccessIterator _last){singleShellInsert(_first,_last,1);}/*** <p> 希爾排序,有步長(zhǎng)的插入排序* @tparam _RandomAccessIterator* @tparam _Compare* @param _first* @param _last* @param _comp*/template<class _RandomAccessIterator, class _Compare>static void shellSort(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp){Size len =_last-_first;std::vector<Size> dlta; // int loopnum =(int)(log10(2*len+1) / log10(3) );for (int i = (len>>1); i >1; i=(i>>1) ){dlta.push_back(i);}dlta.push_back(1);for (int j = 0; j < dlta.size(); ++j) {singleShellInsert(_first,_last,_comp,dlta[j]);}}template<class _RandomAccessIterator>static void shellSort(_RandomAccessIterator _first, _RandomAccessIterator _last){Size len =_last-_first;std::vector<Size> dlta; // int loopnum =(int)(log10(2*len+1) / log10(3) );for (int i = (len>>1); i >1; i=(i>>1) ){dlta.push_back(i);}dlta.push_back(1);for (int j = 0; j < dlta.size(); ++j) {singleShellInsert(_first,_last,dlta[j]);}}/*** <p> 快速排序,每一次partitio確定一個(gè)元素對(duì)應(yīng)的位置,左右兩邊序列遞歸* @tparam _RandomAccessIterator 線性表地址類型* @tparam _Compare 比較函數(shù)類型* @param _first 線性表起始地址* @param _last 線性表結(jié)束地址* @param _comp 比較函數(shù)*/template<class _RandomAccessIterator, class _Compare>static void quickSort(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp){if (_first<_last){_RandomAccessIterator pivotloc = singlePartition(_first,_last,_comp);quickSort(_first,pivotloc-1,_comp);quickSort(pivotloc+1,_last,_comp);}}template<class _RandomAccessIterator>static void quickSort(_RandomAccessIterator _first, _RandomAccessIterator _last){if (_first<_last){_RandomAccessIterator pivotloc = singlePartition(_first,_last); // for (_RandomAccessIterator i = _first; i < _last; ++i) { // std::cout<< *i <<" "; // } // std::cout<<"\n";quickSort(_first,pivotloc-1 );quickSort(pivotloc+1,_last );}}template<class _RandomAccessIterator, class _Compare>static voidmergeSort(_RandomAccessIterator _arr1first, _RandomAccessIterator _arr2first,int s, int t,_Compare _comp) {//把a(bǔ)rr1[s...t] 并入到 arr2[s...t];if (s == t) {*(_arr2first + s) = *(_arr1first + s);} else{int m =(s + t )/2;mergeSort(_arr1first,_arr2first,s,m,_comp);mergeSort(_arr1first,_arr2first,m+1,t,_comp);merging(_arr2first,_arr1first,s,m,t,_comp); // memcpy(_arr2first+s,_arr1first+s,(t-s+1)*sizeof(*_arr2first));}}template<class _RandomAccessIterator>static voidmergeSort(_RandomAccessIterator _arr1first, _RandomAccessIterator _arr2first,int s, int t) {//把a(bǔ)rr1[s...t] 并入到 arr2[s...t];if (s == t) {*(_arr2first + s) = *(_arr1first + s);} else{int m =(s + t )/2;mergeSort(_arr1first,_arr2first,s,m);mergeSort(_arr1first,_arr2first,m+1,t);merging(_arr2first,_arr1first,s,m,t); // memcpy(_arr2first+s,_arr1first+s,(t-s+1)*sizeof(*_arr2first));}}template<class _RandomAccessIterator, class _Compare>static void singleShellInsert(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp,Size dk){for (_RandomAccessIterator iter = _first+ dk ; iter < _last ;iter++){auto temp = *iter;_RandomAccessIterator index = iter -dk;//假如前面 iter -1 個(gè)都已經(jīng)排好序 ,現(xiàn)在插第 iter 個(gè)// 先把iter的值保存起來(lái) 到temp// 然后從 iter -1 開始 和 temp 開始比較,如果小則 index的值往后移// 當(dāng)比較結(jié)果為大時(shí)結(jié)束循環(huán),把 temp 放入到 當(dāng)前比較位置的后一個(gè)for ( ;index >= _first && _comp(temp , *index); index-=dk) {*(index +dk) = *(index);}*(index +dk) = (temp);}}template<class _RandomAccessIterator >static void singleShellInsert(_RandomAccessIterator _first, _RandomAccessIterator _last,Size dk){for (_RandomAccessIterator iter = _first+ dk ; iter < _last ;iter++){auto temp = *iter;_RandomAccessIterator index = iter -dk;//假如前面 iter -1 個(gè)都已經(jīng)排好序 ,現(xiàn)在插第 iter 個(gè)// 先把iter的值保存起來(lái) 到temp// 然后從 iter -1 開始 和 temp 開始比較,如果小則 index的值往后移// 當(dāng)比較結(jié)果為大時(shí)結(jié)束循環(huán),把 temp 放入到 當(dāng)前比較位置的后一個(gè)for ( ;index >= _first && temp < *index; index-=dk) {*(index +dk) = *(index);}*(index +dk) = (temp);}}private:template<class _RandomAccessIterator>static void iteratorSwap(_RandomAccessIterator _elem1, _RandomAccessIterator _elem2){auto temp = *_elem1;*_elem1 = *_elem2;*_elem2 = temp;}template<class _RandomAccessIterator, class _Compare>static _RandomAccessIterator singlePartition(_RandomAccessIterator _first, _RandomAccessIterator _last,_Compare _comp ){auto temp = *_first;while(_first -_last <0){while (_first<_last && _comp(temp,*_last)){--_last;}*_first=*_last;while (_first<_last && _comp(*_first,temp)){++_first;}*_last=*_first;}*_first=temp;return _first;}/*** <p> 找到指定位置* @tparam _RandomAccessIterator* @param _first 包含起始位置* @param _last 包含結(jié)束位置* @return*/template<class _RandomAccessIterator >static _RandomAccessIterator singlePartition(_RandomAccessIterator _first, _RandomAccessIterator _last){auto temp = *_first;while(_first -_last <0){while (_first<_last && temp<=*_last){--_last;}*_first=*_last;while (_first<_last && *_first<=temp){++_first;}*_last=*_first;}*_first=temp;return _first;}template<class _RandomAccessIterator, class _Compare>static voidmerging(_RandomAccessIterator _arr1first, _RandomAccessIterator _arr2first, int i, int m, int n,_Compare _comp) {//把a(bǔ)rr1[i...mid]和arr1[mid+1...n] 并入到 arr2[i .... n];int j,k; //j屬于mid+1...last i屬于i...mid k屬于 i...lastfor (j = m+1 ,k=i; i <=m && j <= n ; ++k) {if (_comp(*(_arr1first + i) , *(_arr1first + j))){*(_arr2first + k) = *(_arr1first+ (i++));} else{*(_arr2first + k) = *(_arr1first+ (j++));}}if ( i <=m){ // memcpy(_arr2first+k,_arr1first+i,(m-i+1)*sizeof(*_arr2first));for (;k<=n && i<=m ; k++,i++) {*(_arr2first + k) = *(_arr1first+ i);}}if ( j <=n){ // memcpy(_arr2first+k,_arr1first+j,(n-j+1)*sizeof(*_arr2first));for (;k<=n && i<=n ; k++,i++) {*(_arr2first + k) = *(_arr1first+ i);}}}template<class _RandomAccessIterator>static voidmerging(_RandomAccessIterator _arr1first, _RandomAccessIterator _arr2first, int i, int m, int n) {//把a(bǔ)rr1[i...mid]和arr1[mid+1...n] 并入到 arr2[i .... n];int j,k; //j屬于mid+1...last i屬于i...mid k屬于 i...lastfor (j = m+1 ,k=i; i <=m && j <= n ; ++k) {if (*(_arr1first + i) < *(_arr1first + j)){*(_arr2first + k) = *(_arr1first+ (i++));} else{*(_arr2first + k) = *(_arr1first+ (j++));}}if ( i <=m){ // memcpy(_arr2first+k,_arr1first+i,(m-i+1)*sizeof(*_arr2first));for (;k<=n && i<=m ; k++,i++) {*(_arr2first + k) = *(_arr1first+ i);}}if ( j <=n){ // memcpy(_arr2first+k,_arr1first+j,(n-j+1)*sizeof(*_arr2first));for (;k<=n && i<=n ; k++,i++) {*(_arr2first + k) = *(_arr1first+ i);}}}/*** 堆節(jié)點(diǎn)"篩選"函數(shù),堆頂自堆底的調(diào)整方式* @tparam _RandomAccessIterator* @tparam _Compare* @param _first* @param _last* @param _comp*/template<class _RandomAccessIterator, class _Compare>static void HeapAdjust(_RandomAccessIterator _first, int nodeIndex,int heapLenth,_Compare _comp ){//從小到大排序用大頂堆,父節(jié)點(diǎn)比自身節(jié)點(diǎn)大,假如按層(從0開始)排列,那么 第n個(gè)節(jié)點(diǎn)的左孩子是 2n+1 2n+2//和自己的孩子進(jìn)行比較然后交換,接著繼續(xù)和孩子比較到葉子節(jié)點(diǎn)auto temp = *(_first + nodeIndex);for (int i = 2*nodeIndex +1; i <=heapLenth ; i =2 *i+1 ) {if (i < heapLenth && _comp( *(_first+i) , *(_first+i+1)))++i;if (!_comp(temp,*(_first + i)))break;*(_first + nodeIndex) = *(_first+i);nodeIndex = i;}*(_first+nodeIndex) = temp;}/*** 堆節(jié)點(diǎn)"篩選"函數(shù),堆頂自堆底的調(diào)整方式* @tparam _RandomAccessIterator* @tparam _Compare* @param _first* @param _last* @param _comp*/template<class _RandomAccessIterator >static void HeapAdjust(_RandomAccessIterator _first, int nodeIndex,int heapLenth){//從小到大排序用大頂堆,父節(jié)點(diǎn)比自身節(jié)點(diǎn)大,假如按層(從0開始)排列,那么 第n個(gè)節(jié)點(diǎn)的左孩子是 2n+1 2n+2//和自己的孩子進(jìn)行比較然后交換,接著繼續(xù)和孩子比較到葉子節(jié)點(diǎn)auto temp = *(_first + nodeIndex);for (int i = 2*nodeIndex +1; i <=heapLenth ; i =2 *i+1 ) {if (i < heapLenth && *(_first+i)< *(_first+i+1) )++i;if (! temp<*(_first + i) )break;*(_first + nodeIndex) = *(_first+i);nodeIndex = i;}*(_first+nodeIndex) = temp;}}; } #endif //SMARTDONGLIB_SORT_Hcpp
// // Created by Administrator on 2020/11/2. //#include<iostream> #include "sdalgorithm/util/sort.h" #include <ctime> #include <malloc.h> #include<algorithm>using namespace std; using namespace SmartDongLib; void print(int a[],int size){for (int i = 0; i < size; ++i) {cout<< a[i]<<" ";}cout<<endl; }; class C1{ public:C1(int a){a_=a;}int a_; }; int main(){const int veclen =100000 ;int a[veclen] ; // a.resize(veclen); // int a[10] ={9,34,24,56,31,24,66,3,45,20}; // Sort::sort(a.begin(),a+veclen,[](int x,int y){return abs(x-30)<=abs(y-30);},SmartDongLib::Sort::QuickSort); // print(a,10);unsigned seed = time(0);srand(seed);for (int i = 0; i < veclen; ++i) {a[i]=rand();}clock_t startSelectionSort,endSelectionSort;startSelectionSort = clock();Sort::sort<int>(a,a+veclen,SmartDongLib::Sort::SelectionSort);endSelectionSort = clock();cout<<"1.SelectionSort:"<< (double)(endSelectionSort - startSelectionSort)<<"\t isSort:"<<std::is_sorted(a,a+veclen)<<endl;for (int i = 0; i < veclen; ++i) {a[i]=rand();}clock_t startBubbleSort,endBubbleSort;startBubbleSort = clock();Sort::sort<int>(a,a+veclen,SmartDongLib::Sort::BubbleSort);endBubbleSort = clock();cout<<"2.BubbleSort:"<< (double)(endBubbleSort - startBubbleSort)<<"\t isSort:"<<std::is_sorted(a,a+veclen)<<endl;;for (int i = 0; i < veclen; ++i) {a[i]=rand();}clock_t startInsertionSort,endInsertionSort;startInsertionSort = clock();Sort::sort<int>(a,a+veclen,SmartDongLib::Sort::InsertionSort);endInsertionSort = clock();cout<<"3.InsertionSort:"<< (double)(endInsertionSort - startInsertionSort)<<"\t isSort:"<<std::is_sorted(a,a+veclen)<<endl;;for (int i = 0; i < veclen; ++i) {a[i]=rand();}clock_t startShellSort,endShellSort;startShellSort = clock();Sort::sort<int>(a,a+veclen,SmartDongLib::Sort::ShellSort);endShellSort = clock();cout<<"4.ShellSort:"<< (double)(endShellSort - startShellSort)<<"\t isSort:"<<std::is_sorted(a,a+veclen)<<endl;;for (int i = 0; i < veclen; ++i) {a[i]=rand();}clock_t startQuickSort,endQuickSort;startQuickSort = clock(); // print(a, veclen);Sort::sort<int>(a,a+veclen,SmartDongLib::Sort::QuickSort); // print(a, veclen);endQuickSort = clock();cout<<"5.QuickSort:"<< (double)(endQuickSort - startQuickSort)<<"\t isSort:"<<std::is_sorted(a,a+veclen)<<endl;;for (int i = 0; i < veclen; ++i) {a[i]=rand();}clock_t startMergingSort,endMergingSort;startMergingSort = clock();Sort::sort<int>(a, a+veclen,Sort::MergingSort) ;endMergingSort = clock();cout<<"6.MergingSort:"<< (double)(endMergingSort - startMergingSort)<<"\t isSort:"<<std::is_sorted(a,a+veclen)<<endl;for (int i = 0; i < veclen; ++i) {a[i]=rand();} // int b[8] = {49,38,65,97,76,13,27,49};clock_t startHeapSort,endHeapSort;startHeapSort = clock();Sort::sort<int>(a, a+veclen,Sort::HeapSort) ;endHeapSort = clock();cout<<"7.HeapSort:"<< (double)(endHeapSort - startHeapSort)<<"\t isSort:"<<std::is_sorted(a,a+veclen)<<endl; // print(a,veclen);for (int i = 0; i < veclen; ++i) {a[i]=rand();}clock_t startSTLSort,endSTLSort;startSTLSort = clock();std::sort(a, a+veclen) ;endSTLSort = clock();cout<<"8.STLSort:"<< (double)(endSTLSort - startSTLSort)<<"\t isSort:"<<std::is_sorted(a,a+veclen)<<endl;}?
輸出結(jié)果
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的内部排序选择、冒泡、插入、希尔、快速、归并、堆排序原理概要和实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++ : 二进制法生成子集
- 下一篇: 时间复杂度、渐进记法、主定理