Comparison-based inner Sorting Algorithm (1)

Source: Internet
Author: User

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/>

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.