7種排序演算法C++實現(標頭檔案)
阿新 • • 發佈:2019-02-12
終於把這幾種排序演算法寫好啦,哈哈哈,記錄一下標頭檔案。
#include<iostream> #include"func.h" using namespace std; class sort { public: void bubblesort(int *a, int n); void selectsort(int *a, int n); void mergesort(int *a, int first, int last); void Quicksort(int *a, int left, int right); void insertsort(int *a, int n); void heapsort(int *a, int n); void radixsort(int *a, int n, int k, int bit); private: int *a; int n; int left, right;//用於歸併排序和快排 int k, bit;//用於基數排序 }; void sort::bubblesort(int *a, int n) { if(n<=0) return ; for(int i=0;i<n;i++) { for(int j=0;j<n-i-1;j++) { if(a[j]>a[j+1]) swap(a[j],a[j+1]); } } return ; } void sort::selectsort(int *a, int n) { if(n<=0) return ; for(int i=0;i<n;i++) { int min=INT_MAX; int pos; for(int j=i;j<n;j++) { if(a[j]<min) { min=a[j]; pos=j; } } swap(a[i],a[pos]); } return ; } void sort::mergesort(int *a, int first, int last) { if(first>=last) return; int mid=(first+last)/2; mergesort(a, first, mid); mergesort(a, mid+1, last); merge(a, first, mid, last); } void sort::Quicksort(int *a, int left, int right) { if(left>=right) return; int temp=a[left], i=left, j=right; if(left<right) { while(i<j) { while(i<j && a[j]>=temp) j--; while(i<j && a[i]<=temp) i++; swap(a[i],a[j]); } swap(a[left],a[i]); } Quicksort(a, left, i-1); Quicksort(a, i+1, right); } void sort::insertsort(int *a, int n) { if(n<=1) return ; for(int i=1;i<n;i++) { for(int j=i;j>=1;j--) { if(a[j]>=a[j-1]) break; else swap(a[j],a[j-1]); } } } void sort::heapsort(int *a, int n) { makeheap(a, n); int *b=new int[n](); for(int i=0;i<n;i++) { b[n-i-1]=a[0]; swap(a[0],a[n-i-1]); makeheap(a, n-i-1); } for(int i=0;i<n;i++) a[i]=b[i]; delete []b; } void sort::radixsort(int *a, int n, int k, int bit) { for(int i=1; i<=bit;i++) countsort(a, n, k, i); }
#include<iostream> using namespace std; void swap(int &a, int &b) { int c=a; a=b; b=c; } void merge(int *a, int first, int mid, int last) { int *b=new int[last-first+1]; int a1_first=first, a1_last=mid; int a2_first=mid+1, a2_last=last; int k=0; while(a1_first<=a1_last && a2_first<=a2_last) { if(a[a1_first]<a[a2_first]) { b[k++]=a[a1_first++]; } if(a[a1_first]>=a[a2_first]) b[k++]=a[a2_first++]; } while(a1_first<=a1_last) b[k++]=a[a1_first++]; while(a2_first<=a2_last) b[k++]=a[a2_first++]; for(int i=first;i<=last;i++) a[i]=b[i-first]; return ; } void makeheap(int *a, int n) { if(n<=1) return ; for(int i=n-1;i>=0;i--) { if(a[(i-1)/2]<a[i]) swap(a[(i-1)/2], a[i]); } } int kthbit(int number, int k) { int pow=1; while(k-->0) pow*=10; int res=(number%pow-number%(pow/10))/(pow/10); return res; } void countsort(int *a, int n, int k, int bit) { int *b=new int[k](); int *c=new int[n]; for(int i=0;i<n;i++) { b[kthbit(a[i],bit)]++; } for(int i=1;i<k;i++) b[i]+=b[i-1]; for(int i=n-1;i>=0;i--) { b[kthbit(a[i],bit)]--; c[b[kthbit(a[i],bit)]]=a[i]; } for(int i=0;i<n;i++) a[i]=c[i]; delete []b; delete []c; }//每一位數都小於k,按照第bit位進行排序