• 几种排序算法 C++


    SortAlgorithm.h

    #include <vector>
    using namespace std;
    
    class SortAlgorithm
    {
    public:
        SortAlgorithm(int = 10);
        void displayVector();
        void swap(int &, int &);
        
        void insertSort();                     //O(n^2)
        void selectSort();                    //O(n^2)
        void mergeSort();                    //O(n log n)
        void bubbleSort();                  //O(n^2)
        void quickSort(  int , int  );     //worst: O(n^2),  best: O(n log n)
        
        int partition( int , int  );
        void sortSubVector(int , int );
        void merge(int , int , int , int );
    private:
        int size;
        vector< int > source;
        vector< int > temp;
        
    };

    SortAlgorithm.cpp

    #include <iostream>
    #include <cstdlib> // prototypes for functions srand and rand
    #include <ctime> // prototype for function time
    #include <algorithm> // prototype for sort function
    #include "SortAlgorithm.h" // class BinarySearch definition
    using namespace std;
    
    SortAlgorithm::SortAlgorithm(int vectorSize)
    {
        size = ( vectorSize > 0 ? vectorSize : 10 ); // validate vectorSize
        srand( time( 0 ) ); // seed using current time
    
       // fill vector with random ints in range 10-99
        for ( int i = 0; i < size; i++ )
               source.push_back( 10 + rand() % 90 ); // 10-99
    
        temp = source;
    }
    
    void SortAlgorithm::insertSort()
    {
        int insert;
        for(int next = 1; next < size; next++){
            insert = temp[next];
            int moveItem = next;
    
            while((moveItem > 0) && (temp[moveItem - 1] > insert)){
                temp[moveItem] = temp[moveItem - 1];
                moveItem--;
            }
    
            temp[moveItem] = insert;
        }
    }
    
    void SortAlgorithm::selectSort()
    {
        int loop = size - 1;
        int smallest;
        
        for(int i = 0; i < loop; i++){
            smallest = i;
    
            for(int j = i + 1; j < size; j++){
                if(temp[j] < temp[smallest])
                    smallest = j;
            }
            
            swap(temp[i], temp[smallest]);
        }
    }
    
    void SortAlgorithm::mergeSort()
    {
        sortSubVector(0, size - 1);
    }
    
    void SortAlgorithm::bubbleSort()
    {
           int comp; // used to control for loop and for subscripts
           bool swapCheck = true; // was a swap made?
    
        for ( int pass = 1; pass < size && swapCheck; pass++ ) {
            swapCheck = false; // assume no swaps will be made
    
          // traverse and compare unsorted part of vector
            for ( comp = 0; comp < size - pass; comp++ ){
    
             // compare adjacent vector elements
                if ( temp[ comp ] > temp[ comp + 1 ] ) {
                    swap(temp[comp], temp[comp + 1]);
                    swapCheck = true;
                     } // end if
    
            } // end inner for
        } // end outer for
    }
    
    void SortAlgorithm::quickSort(int first, int last )
    {
       int currentLocation;
    
       if ( first >= last )
          return;
    
       currentLocation = partition( first, last ); // place an element
       quickSort( first, currentLocation - 1 ); // sort left side
       quickSort( currentLocation + 1, last ); // sort right side
    } // end function quickSortHelper
    
    // partition the vector into multiple sections
    int SortAlgorithm::partition( int left, int right )
    {
       int position = left;
    
       // loop through the portion of the vector
       while ( true ) 
       {
       //first: from right ro left
          while ( temp[ position ] <= temp[ right ] && position != right )
             --right;
    
          if ( position == right )
             return position;
    
          if ( temp[ position ] > temp[ right ]) 
          {
             swap( temp[ position ], temp[ right ] );
             position = right;
          } // end if
       //second: from left to right
          while ( temp[ left ] <= temp[ position ] && left != position )
             ++left;
    
          if ( position == left )
             return position;
    
          if ( temp[ left ] > temp[ position ] ) 
          {
             swap( temp[ position ], temp[ left ] );
             position = left;
          } // end if
       } // end while
    } // end function partition
    
    void SortAlgorithm::sortSubVector(int low, int high)
    {
        if((high - low) >= 1){
            int middle1 = (low + high) / 2;
            int middle2 = middle1 + 1;
    
            /*cout << "split:   ";
            displaySubVector(low, high);
            cout << endl << "       ";
            displaySubVector(low, middle1);
            cout << endl << "       ";
            displaySubVector(middle2, high);
            cout << endl << endl;*/
    
            sortSubVector(low, middle1);
            //cout << "Stop here1. low = " << low << ", middle1 = " << middle1 << endl;
            sortSubVector(middle2, high);
            //cout << "Stop here2. middle2 = " << middle2 << ", high = " << high << endl;
    
            merge(low, middle1, middle2, high);
    
        }
    }
    
    void SortAlgorithm::merge(int left, int middle1, int middle2, int right)
    {
        int leftIndex = left;
        int rightIndex = middle2;
        int combinedIndex = left;
        vector<int> combined(size);
    
        /*cout << "merge:   ";
        displaySubVector(left, middle1);
        cout << endl << "       ";
        displaySubVector(middle2, right);
        cout << endl;*/
    
        while(leftIndex <= middle1 && rightIndex <= right){
            if(temp[leftIndex] <= temp[rightIndex])
                combined[combinedIndex++] = temp[leftIndex++];
            else
                combined[combinedIndex++] = temp[rightIndex++];
        }
    
        if(leftIndex == middle2){
            while(rightIndex <= right)
                combined[combinedIndex++] = temp[rightIndex++];
        }
        else{
            while(leftIndex <= middle1)
                combined[combinedIndex++] = temp[leftIndex++];
        }
    
        for(int i = left; i <= right; i++)
            temp[i] = combined[i];
    
        /*cout << "       ";
        displaySubVector(left, right);
        cout << endl << endl;*/
    }
    
    void SortAlgorithm::swap(int &x, int &y)
    {
        int t;
    
        t = x;
        x = y;
        y = t;
    }
    
    void SortAlgorithm::displayVector()
    {
        for(int i = 0; i < size; i++){
            cout << " " << temp[i];
            if((i + 1) % 10 == 0)
                cout << endl;
        }
    
        cout << endl;
    
        temp = source;
    }

    main.cpp

    #include <iostream>
    #include "SortAlgorithm.h" // class BinarySearch definition
    #include "BucketSort.h"
    using namespace std;
    
    int main()
    {
        int num;
        cout << "Please input the integer number you want to sort:  ";
        cin >> num;
    
        SortAlgorithm sortVector(num);
        cout << "Unsort elements: 
    ";
        sortVector.displayVector();
    
        sortVector.insertSort();
        cout << "
    Insert sorted elements: 
    ";
        sortVector.displayVector();
    
        sortVector.selectSort();
        cout << "
    Select sorted elements: 
    ";
        sortVector.displayVector();
    
        sortVector.mergeSort();
        cout << "
    Merge sorted elements: 
    ";
        sortVector.displayVector();
    
        sortVector.bubbleSort();
        cout << "
    Bubble sorted elements: 
    ";
        sortVector.displayVector();
    
        sortVector.quickSort(0, num - 1);
        cout << "
    Quick sorted elements: 
    ";
        sortVector.displayVector();
    
       /*BucketSort bucketSortVector( num ); // create BucketSort object
    
       cout << "Vector elements in original order:
    ";
       bucketSortVector.displayElements();
    
       bucketSortVector.sort(); // sort the vector
    
       cout << "
    Vector elements in sorted order:
    ";
       bucketSortVector.displayElements();*/
    }
  • 相关阅读:
    python 基础知识(一)
    挖坑和打井的思考
    静坐冥想
    恭喜你被裁员了!
    什么叫做内心强大?怎样变成一个内心强大的人?
    年轻人,你的时间到哪啦?
    树莓派3B+ 人脸识别、摄像头安装和使用
    树莓派3b+ 实现视频监控
    如何设置树莓派 VNC 的分辨率
    为什么大多数托管辅导班做不大?
  • 原文地址:https://www.cnblogs.com/huanchao/p/3562576.html
Copyright © 2020-2023  润新知