折半插入排序-ACM題

第一種實現方式:(本人一開始對cin的使用不是很熟悉,看了一些人得博客詳解後纔有了第一種方式的實現,本身都被驚訝到了so easy:題目在下面)php

//
//  main.cpp
//  BinaryInsertSort
//
//  Created by Jason on 16/9/28.
//  Copyright © 2016年 Jason. All rights reserved.
//

#include <iostream>
using namespace std;
//折半插入排序-算法
void BinaryInsertSort(int R[],int n )
{
    int i,j,mid,low,high,temp;
    for(i=2; i<=n; ++i)
    {
        R[0] = R[i];
        low = 1;
        high = i-1;
        while(low <= high)
        {
            mid = (low + high) / 2;
            if(temp > R[mid])
            {
                low = mid + 1;
            }else{
                high = mid - 1;
            }
        }
        for(j=i-1; j>=high+1; --j)
        {
            R[j+1] = R[j];
        }
        R[high+1] = R[0];
    }
}
int main(int argc, const char * argv[]) {
    int n;
    int i = 0;
    cin>>n;
    if(n<=1000&&n>=1)
    {
        int R[n];
        int b;
        while(i<n&&cin>>b)
        {
            R[i] = b;
            i++;
        }
        BinaryInsertSort(R,n);
        for(int j=0; j<n; ++j)
        {
            cout << R[j] <<" ";
        }
        cout << endl;
    }
    return 0;
}

  

 

第二種實現方式ios

//  main.cpp

//  ACM_1775

//  Created by Jason on 16/9/27.

//  Copyright © 2016年 Jason. All rights reserved.

/**

 ACM題目:

    地址:http://arena.acmclub.com/problem.php?id=1775

     輸入

     輸入的第一行包含1個正整數n,表示共有n個整數須要參與排序。其中n不超過1000。

     第二行包含n個用空格隔開的正整數,表示n個須要排序的整數。

     輸出

     只有1行,包含n個整數,表示從小到大排序完畢的全部整數。

     請在每一個整數後輸出一個空格,並請注意行尾輸出換行。

     樣例輸入

     10

     2 8 4 6 1 10 7 3 5 9

     樣例輸出

     1 2 3 4 5 6 7 8 9 10

     提示

     在本題中,須要按照題目描述中的算法完成折半插入排序的算法。與直接插入排序算法不一樣,折半插入排序算法在查找插入位置時採用了折半查找的方案,減小了關鍵字之間的比較次數,可是記錄的移動次數並無發生改變,所以折半插入排序的時間複雜度依舊爲O(n2),一樣不是一種很是高效的排序方法。

 **/

#include <iostream>

#include <sstream>//包含串流輸入輸入類

#include <string>

using namespace std;

//折半插入算法

void BinaryInsertSort(int R[],int n )

{

    int i,j,mid,low,high,temp;

    for(i=1; i<n; ++i)

    {

        temp = R[i];

        low = 0;

        high = i;

        while(low <= high)

        {

            mid = (low + high) / 2;

            if(temp > R[mid])

            {

                low = mid + 1;

            }else{

                high = mid - 1;

            }

        }

        for(j=i-1; j>=low; --j)

        {

            R[j+1] = R[j];

        }

        R[low] = temp;

    }

}

int main(int argc, const char * argv[]) {

    

    int k = 0;

    int n;

    cin>>n;

    int R[n];

    /**

     問題:下面的getline(cin,m)無法鍵盤輸入,直接跳過

     解決:因爲在寫getline()函數以前,使用過了回車

     (不論你輸入的是字符,數字或是回車,空格符,getline()函數都接收)

     而cin>>這種輸入方式倒是忽略回車的,若是你在getline()以前cin的一個數,回車被cin忽略了,卻被getline函數接收了,感受就是這條語句被跳過了

     因此解決的辦法是在getline函數以前再使用getline一次,將輸入流裏的回車符接收掉,後面就能正常輸入了

     **/

    if (n<=1000&&n>=1) {

        string m;

        /**

         getline 函數不是c庫函數而是C++庫函數,

         getline函數是一個比較常見的函數。根據它的名字咱們就能夠知道這個函數是來完成讀入一行數據的

         C++中定義了一個在std名字空間的全局函數,由於這個getline函數的參數使用了string字符串,因此聲明在了<string>頭文件中了。

         **/

        getline(cin, m);

        getline(cin, m);

        /**

         C++引入了ostringstream、istringstream、stringstream這三個類,要使用他們建立對象就必須包含<sstream>這個頭文件。

         istringstream類用於執行C++風格的串流的輸入操做。

         ostringstream類用於執行C風格的串流的輸出操做。

         strstream類同時能夠支持C風格的串流的輸入輸出操做。

         istringstream的構造函數原形以下:

         istringstream::istringstream(string str);

         它的做用是從string對象str中讀取字符。

         getline()的原型是istream& getline ( istream &is , string &str , char delim );

         其中 istream &is 表示一個輸入流,譬如cin;string&str表示把從輸入流讀入的字符串存放在這個字符串中(能夠本身隨便命名,str什麼的均可以);

         char delim表示遇到這個字符中止讀入,在不設置的狀況下系統默認該字符爲'\n',也就是回車換行符(遇到回車中止讀入)

         **/

        istringstream is(m);

        int number;

        while(is>>number)

        {

            R[k] = number;

            k++;

        }

        BinaryInsertSort(R,n);

        for(int j=0; j<n; ++j)

        {

            cout << R[j] <<" ";

        }

        cout << endl;

    }
}
相關文章
相關標籤/搜索