Today, I wrote a comparison-based internal sorting algorithm, including bubblesort, selectsort, insertsort, heapsort, quicksort, and shellshort. Mergesort makes up after leaving the interface. Next, we will summarize the time complexity, stability, and applicability of several sort types.
# Include <iostream> <br/> # include <string> <br/> # include <cstring> <br/> # include <cmath> <br/> # include <cassert> <br/> # include <ctime> <br/> # include <cstdlib> <br/> using namespace STD; </P> <p> class sort {<br/> Public: <br/> sort (int *, INT); <br/> ~ Sort (); <br/> void setbeginend (INT, INT); <br/> void setdata (int *, INT); <br/> void move (INT ); <br/> static const string & getname (INT); <br/> static int getways (); <br/> void dump () const; <br/> PRIVATE: <br/> void bubblesort (); <br/> void selectsort (); <br/> void insertsort (); <br/> void mergesort (); <br/> void quicksort (); <br/> void heapsort (); <br/> void shellsort (); <br/> void swap (Int &, int &); <Br/> void quicksort1 (INT, INT); <br/> int partition (INT, INT); <br/> void heapify (INT ); <br/> void creatheap (); <br/> PRIVATE: <br/> int * vdata; <br/> int vsize; <br/> int begin, end; <br/> typedef void (sort: * func) (); <br/> static const func funcptr []; <br/> static const string name []; <br/>}; <br/> const string sort: name [] = {"bubblesort", <br/> "selectsort", <br/> "insertsort ", <br/> "mergesort ", <Br/>" quicksort ", <br/>" heapsort ", <br/>" shellsort "};< br/> const sort: func sort :: funcptr [] ={ & sort: bubblesort, <br/> & sort: selectsort, <br/> & sort: insertsort, <br/> & sort :: mergesort, <br/> & sort: quicksort, <br/> & sort: heapsort, <br/> & sort: shellsort }; </P> <p> sort: Sort (int * a, int N): vsize (N), begin (0), end (n-1) {<br/> vdata = new int [N]; <br/> memmove (vdata, A, N * sizeof (INT); <br/>}< br /> Sort ::~ Sort () {<br/> Delete [] vdata; <br/>}< br/> void sort: setbeginend (int s, int T) {<br/> If (S> T) {<br/> begin = T; <br/> end = s; <br/>}else {<br/> begin = s; <br/> end = T; <br/>}< br/> void sort:: setdata (int * a, int N) {<br/> Delete [] vdata; <br/> vdata = new int [N]; <br/> memmove (vdata, a, N * sizeof (INT); <br/> vsize = N; <br/> begin = 0; <br/> end = n-1; <br/>}< br/> void sort: Move (int T) {<br/> (this-> * funcptr [T]) (); <br/>}< br/> const string & sort: getname (int I) {<br/> return name [I]; <br/>}< br/> int sort: getways () {<br/> return sizeof (funcptr) /sizeof (func); <br/>}< br/> void sort: dump () const {<br/> assert (begin <= END ); <br/> If (begin = END) {<br/> cout <"(" <vdata [begin] <")" <Endl; <br/>} else {<br/> cout <"(" <vdata [begin]; <br/> for (INT I = begin + 1; I <= end; I ++) <B R/> cout <"," <vdata [I]; <br/> cout <")" <Endl; <br/>}< br/> void sort: bubblesort () {<br/> for (INT I = 0; I <End-begin; I ++) <br/> for (Int J = begin + 1; j <= end-I; j ++) <br/> If (vdata [J-1]> vdata [J]) <br/> swap (vdata [J-1], vdata [J]); <br/>}< br/> void sort: selectsort () {<br/> for (INT I = 0; I <End-begin; I ++) {<br/> int min = begin + I; <br/> for (Int J = begin + I + 1; j <= end; j ++) {<br/> If (vdata [J] <VD ATA [Min]) <br/> min = J; <br/>}< br/> swap (vdata [Min], vdata [begin + I]); <br/>}< br/> void sort: insertsort () {<br/> for (INT I = begin + 1, J; I <= end; I ++) {<br/> int TMP = vdata [I]; <br/> for (j = I-1; j> = begin & TMP <vdata [J]; j --) {<br/> vdata [J + 1] = vdata [J]; <br/>}< br/> vdata [J + 1] = TMP; <br/>}< br/> void sort: mergesort () {</P> <p >}< br/> void sort: quicksort () {<br/> quicksort1 (begin, end); <br/ >}< Br/> void sort: heapsort () {<br/> creatheap (); <br/> int TMP = vsize; <br/> for (INT I = vSize-1; I> = 0; I --) {<br/> swap (vdata [I], vdata [0]); <br/> vsize --; <br/> heapify (0); <br/>}< br/> vsize = TMP; <br/>}< br/> void sort: shellsort () {<br/> int step = SQRT (vsize); <br/> for (INT I = step; i> = 1; I --) {<br/> for (Int J = begin + I, K; j <= end; j + = I) {<br/> int TMP = vdata [J]; <br/> for (k = J-I; k> = begin & TMP <vdata [k]; k- = I) <br/> vdata [K + I] = vdata [k]; <br/> vdata [K + I] = TMP; <br/>}< br/> void sort: swap (Int & A, Int & B) {<br/> int TMP = A; <br/> A = B; <br/> B = TMP; <br/>}< br/> void sort :: quicksort1 (int s, int f) {<br/> If (S <F) {<br/> int Pos = partition (S, F ); <br/> quicksort1 (S, pos-1); <br/> quicksort1 (Pos + 1, F ); <br/>}< br/> int sort: partition (int s, int f) {<br/> int L = s, r = F; <br/> int Ba Se = vdata [l]; <br/> while (L <r) {<br/> while (vdata [l] <= base & L <= r) <br/> L ++; <br/> while (vdata [R]> = base & L <= r) <br/> r --; <br/> If (L <r) <br/> swap (vdata [L], vdata [R]); <br/>}< br/> swap (vdata [R], vdata [s]); <br/> return R; <br/>}< br/>/* node from 0 to n-1, node I's left child is 2 * I + 1 and right child <br/> * is 2 * I + 2, and parent is (I-1)/2, leaf node is from size/2 to size */<br/> void so RT: heapify (Int J) {<br/> # define LC (I) (2 * I + 1) <br/> # define RC (I) (2 * I + 2) <br/> # define PA (I) (I-1)/2) <br/> If (j <vsize/2) {<br/> int max = vdata [J]; <br/> bool isleft, isright; <br/> isleft = isright = false; <br/> If (vdata [RC (j)]> MAX & rc (j) <vsize) {<br/> max = vdata [RC (j)]; <br/> isright = true; <br/>}< br/> If (vdata [LC (j)]> MAX & lc (j) <vsize) {<br/> isleft = true; <br/>}< br/> If (is Left) {<br/> swap (vdata [J], vdata [LC (j)]); <br/> heapify (LC (j )); <br/>} else if (isright) {<br/> swap (vdata [J], vdata [RC (j)]); <br/> heapify (RC (j); <br/>}< br/> void sort: creatheap () {<br/> for (INT I = vsize/2-1; I> = 0; I --) <br/> heapify (I ); <br/>}< br/> void print (int * a, int N) {<br/> If (n! = 0) {<br/> cout <"(" <A [0]; <br/> for (INT I = 1; I <n; I ++) <br/> cout <"," <A [I]; <br/> cout <")" <Endl; <br/>} else <br/> cout <"empty! "<Endl; <br/>}</P> <p> int main (INT argc, char * argv []) <br/>{< br/> int A [] = }; <br/> int * B, num; <br/> clock_t start, finish; </P> <p> If (argc = 1) {<br/> num = sizeof (a)/sizeof (INT); <br/> B = new int [num]; <br/> memmove (B,, sizeof (a); <br/>} else if (argc> = 2) {<br/> srand (Time (null )); <br/> num = atoi (argv [1]); <br/> const int max = 1000; <br/> B = new int [num]; <br/> for (INT I = 0; I <num; I ++) <br/> B [I] = rand () % Max; <br/>}< br/> for (INT I = 0; I <sort: getways (); I ++) {<br/> sort S (B, num); <br/> Start = clock (); <br/> S. move (I); <br/> finish = clock (); <br/> cout <sort: getname (I) <"/t "; <br/> cout <(double) (finish-Start)/clocks_per_sec <"S" <Endl; <br/> # ifdef debug <br/> Print (B, num); <br/> S. dump (); <br/># endif <br/>}< br/> return 0; <br/>}< br/>