// data_sort_alg.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "sort_alg.h" #include <iostream> #include <vector> void show(std::vector<int> &a) { std::vector<int>::iterator it=a.begin(); while(it!=a.end()) { std::cout<<*it<<" "; ++it; } std::cout<<std::endl; return; } int main(void) { int a[11]={1,-4,43,12,0,6,78,32,23,10,8}; int b[12]={0,1,-4,43,12,0,6,78,32,23,10,8}; int c[11]={9,3,45,43,95,92,90,72,32,30,66}; int d[11]={9,34,79,23,345,78,120,4578,547,89,500}; std::vector<int> src(a,a+11); std::vector<int> src1(b,b+12); //heap sort std::vector<int> src2(c,c+11); //bucket sort std::vector<int> src3(d,d+11); // radix sort std::cout<<"The original data order is:"<<std::endl; show(src3); radix_sort(src3); std::cout<<"The sorting result is:"<<std::endl; show(src3); system("pause"); return 0; }
#ifndef SORT_ALG_H #define SORT_ALG_H #include <vector> void bubble_sort(std::vector<int> &a); void shell_sort(std::vector<int> &a); void simple_sort(std::vector<int> &a); void merge_sort(std::vector<int> &s,int b,int e); void insert_sort(std::vector<int>& a); void heap_sort(std::vector<int> &a); void fast_sort(std::vector<int> &a,int start,int end); void bucket_sort(std::vector<int> &a); void radix_sort(std::vector<int> &a); #endif
#include "stdafx.h" #include <vector> #include<algorithm> #define STEP 5 /*============================== 1 name:bubble sort -------------------------------- time complexity: worst average best O(n^2) O(n^2) O(n) -------------------------------- space complexity: O(1) -------------------------------- stability: stable ==============================*/ void bubble_sort(std::vector<int> &a) { for(int i=a.size()-1;i>0;i--) { for(int j=0;j<i;j++) { if(a[j]>a[j+1]) { std::swap(a[j],a[j+1]); } } } return; } /*============================== 2 name:shell sort -------------------------------- time complexity: worst average best O(ns) O(nlogn) O(n) 1<s<2 -------------------------------- space complexity: O(1) -------------------------------- stability: unstable ==============================*/ void shell_sort_assist(std::vector<int> &a,int d) { int i=d; while(i<a.size()) { int j=0; while(j<i) { if(a[i]<a[j]) { int temp=a[i]; int k=i; while(k-d>=j) { a[k]=a[k-d]; k=k-d; } a[j]=temp; break; } j=j+d; } i=i+d; } return; } void shell_sort(std::vector<int> &a) { int d=STEP; while(d!=0) { shell_sort_assist(a,d); d/=2; } return; } /*============================== 3 name:simple sort -------------------------------- time complexity: worst average best O(n^2) O(n^2) O(n^2) -------------------------------- space complexity: O(1) -------------------------------- stability: unstable ==============================*/ void simple_sort(std::vector<int> &a) { std::vector<int>::iterator it=a.begin(),it1,saveit; for(;it!=a.end();it++) { int min=*it; saveit=it; it1=it; while(it1!=a.end()) { if(min>*it1) { min=*it1; saveit=it1; } it1++; } if(saveit!=it) { std::swap(*it,*saveit); } } return; } /*============================== 4 name: merge sort -------------------------------- time complexity: worst average best O(nlogn) O(nlogn) O(nlogn) -------------------------------- space complexity: O(n) -------------------------------- stability: stable ==============================*/ void merge(std::vector<int> &s,int b,int m,int e) { int* temp=new int[e-b+1]; int i=b; int j=m+1; int k=0; while(i<m+1 && j<e+1) { if(s[i]>s[j]) { temp[k++]=s[j++]; } else { temp[k++]=s[i++]; } } if(i<m+1) { while(i<m+1) { temp[k++]=s[i++]; } } if(j<e+1) { while(j<e+1) { temp[k++]=s[j++]; } } for(int m=0;m<e-b+1;m++) { s[b+m]=temp[m]; } delete [] temp; return; } void merge_sort(std::vector<int> &s,int b,int e) { int m; if(e>b) { m=(b+e)/2; merge_sort(s,b,m); merge_sort(s,m+1,e); merge(s,b,m,e); } return; } /*============================== 5 name: insert sort -------------------------------- time complexity: worst average best O(n^2) O(n^2) O(n) -------------------------------- space complexity: O(1) -------------------------------- stability: stable ==============================*/ void insert_sort(std::vector<int>& a) { std::vector<int>::iterator it,it1,it2; int temp; it=a.begin(); while(it!=a.end()) { it1=a.begin(); while(it1!=it) { if(*it<*it1) { temp=*it; it2=it; while(it2!=it1) { *it2=*(it2-1); it2--; } *it1=temp; break; } it1++; } it++; } } /*============================== 6 name: heap sort -------------------------------- time complexity: worst average best O(nlogn) O(nlogn) O(nlogn) -------------------------------- space complexity: O(1) -------------------------------- stability: unstable ==============================*/ void heap_adjust(std::vector<int> &a,int i,int end) { int lchild=2*i; int rchild=2*i+1; int max=i; if(rchild<end+1) { if(a[lchild]>a[max]) { max=lchild; } if(a[rchild]>a[max]) { max=rchild; } if(max!=i) { std::swap(a[max],a[i]); heap_adjust(a,max,end); } } } void build_heap(std::vector<int> &a) { int size=a.size()-1; for(int i=size/2;i>0;i--) { heap_adjust(a,i,size); } return; } void heap_sort(std::vector<int> &a) { build_heap(a); for(int i=a.size()-1;i>0;i--) { std::swap(a[1],a[i]); heap_adjust(a,1,i-1); } } /*============================== 7 name: fast sort -------------------------------- time complexity: worst average best O(n^2) O(nlogn) O(nlogn) -------------------------------- space complexity: O(logn) -------------------------------- stability: unstable ==============================*/ void fast_sort(std::vector<int> &a,int start,int end) { int med=a[start]; int i=start; int j=end; while(j>i) { while(a[j]>=med && j>i) { j--; } a[i]=a[j]; while(a[i]<=med && j>i) { i++; } a[j]=a[i]; } a[i]=med; if(start<i) { fast_sort(a,start,i); } if(i+1<end) { fast_sort(a,i+1,end); } return; } /*============================== 8 name:bucket sort -------------------------------- time complexity: average O(n+nlogn-nlogm) -------------------------------- space complexity: O(n) -------------------------------- stability: unstable ==============================*/ //suppose: 0<data[i]<100 //we should design the project function based on the data distribution void bucket_sort(std::vector<int> &a) { std::vector<std::vector<int>> bucket; bucket.resize(10); std::vector<int>::iterator it=a.begin(); while(it!=a.end()) { int idx=*it/10; bucket[idx].push_back(*it); it++; } std::vector<std::vector<int>>::iterator it1=bucket.begin(); while(it1!=bucket.end()) { simple_sort(*it1); it1++; } it=a.begin(); it1=bucket.begin(); while(it!=a.end() && it1!=bucket.end()) { std::vector<int>::iterator tmp_it=(*it1).begin(); while(tmp_it!=(*it1).end()) { *it=*tmp_it; tmp_it++; it++; } it1++; } } /*============================== 9 name: radix sort -------------------------------- time complexity: average O(2dn) -------------------------------- space complexity: O(n) -------------------------------- stability: stable ==============================*/ void refresh_data(std::vector<int> &a, std::vector<std::vector<int>> &sto) { std::vector<int>::iterator it,it1; std::vector<std::vector<int>>::iterator it2; it=a.begin(); it2=sto.begin(); while(it!=a.end() && it2!=sto.end()) { it1=(*it2).begin(); while(it1!=(*it2).end()) { *it=*it1; it1++; it++; } (*it2).clear(); it2++; } return; } //suppose:there are no minus number void radix_sort(std::vector<int> &a) { std::vector<std::vector<int>> sto; sto.resize(10); int max=0; std::vector<int>::iterator it=a.begin(); while(it!=a.end()) { int idx; if(max<*it) { max=*it; } idx=(*it)%10; sto[idx].push_back(*it); it++; } refresh_data(a,sto); int d=0; int temp=max; while(1) { if(temp!=0) { d++; } else { break; } temp/=10; } for(int i=1;i<=d;i++) { int div=pow(10.0,i); it=a.begin(); while(it!=a.end()) { int idx; idx=(*it/div)%10; sto[idx].push_back(*it); it++; } refresh_data(a,sto); } return; }