1. 程式人生 > >《演算法》第二章——Nuts and bolts(螺絲和螺帽)

《演算法》第二章——Nuts and bolts(螺絲和螺帽)

/*假設螺釘和螺帽大小沒有一樣的。
    每次取nuts陣列中最後一個元素到bolts陣列中去找和它配對的元素,這樣可以避免nuts陣列中後部元素前移。*/
#include<iostream>
using namespace std;

int partition(int *nuts,int *bolts,int lo,int hi)
{//為了保證操作nuts和bolts陣列的一致性,將每次配對成功的元素放在hi的位置。
  int nuts_t = nuts[hi];
  int i=lo;
  int j=hi;
  int bolt_match=0;

  while(true)
  {//在bolts中找到配的nuts並將bolts分割槽
    while(bolts[i] <= nuts_t)
    {
      if(nuts_t == bolts[i])
      {//先判斷匹配的情況——找到完全相同的一對
        bolt_match = bolts[i];
        cout<<nuts_t<<"&"<<bolts[i]<<endl;
        for(int k = i + 1;k <= hi;k++)
        {//把當前匹配的元素位置通過後面的元素前移一格的方式填充
          bolts[k -1] = bolts[k];
        }

        j--;//j一定指向後面要移動的某個元素,所以需要跟著遞減1
        hi--;//陣列長度減1

//        for(int k=lo;k<=hi;k++)
//          cout<<bolts[k]<<" ";
//        cout<<endl;

       // i++;這裡不需要指標後移
        if(i > hi)//別越界
          break;
      }
      else
      {
        i++;
        if(i > hi)//別越界
          break;
      }
    }//從左往右找到第一個大的螺釘

    while(bolts[j] >= nuts_t)
    {
      if(nuts_t == bolts[j])
      {//先判斷匹配的情況
        bolt_match = bolts[j];
        cout<<nuts_t<<"&"<<bolts[j]<<endl;
        for(int k = j + 1;k <= hi;k++)
        {//把當前匹配的元素位置通過後面的元素前移一格的方式填充
          bolts[k -1] = bolts[k];
        }
        hi--;
        j--;//j指標前移

//        for(int k=lo;k<=hi;k++)
//          cout<<bolts[k]<<" ";
//        cout<<endl;

        if(j < lo)//別越界
          break;
      }
      else
      {
        j--;
        if(j < lo)//別越界
          break;
      }
    }//從右往左找到第一個小的螺釘

    if(i >= j)//陣列掃描過一遍
    {
      if(i == j)
        cout<<"error"<<endl;
      break;
    }
    int tmp = bolts[i];//交換
    bolts[i] = bolts[j];
    bolts[j] = tmp;
  }

//  for(int k=lo;k<=hi;k++)
//    cout<<bolts[k]<<" ";
//  cout<<endl;


  i = lo;
  j = hi;
  while(true)
  {//用上面bolts陣列中找到的配對的螺釘,將nuts分割槽
    while(nuts[i] < bolt_match)
    {
      i++;
      if(i > hi)//別越界
        break;
    }
    while(nuts[j] > bolt_match)
    {
      j--;
      if(j < lo)//別越界
        break;
    }
    if(i > j)
      break;
    int tmp = nuts[i];//交換
    nuts[i] = nuts[j];
    nuts[j] = tmp;
  }
//  for(int k=lo;k<=hi;k++)
//    cout<<nuts[k]<<" ";
//  cout<<endl;

  return i;//第一個比較大的元素
}

void sort(int *nuts,int *bolts,int lo,int hi)
{
  if(lo == hi)
  {
    cout<<nuts[hi]<<"&"<<bolts[hi]<<endl;
    return;
  }
  else if(lo > hi)
  {
    return;
  }
  int j = partition(nuts,bolts,lo,hi);
  hi--;//經過一次劃分後會成功配對一次,相應的hi要減一
//  cout<<"j->"<<j<<endl;
//  cout<<"lo->"<<lo<<endl;
//  cout<<"hi->"<<hi<<endl;
  sort(nuts,bolts,lo,j-1);
  sort(nuts,bolts,j,hi);
}

int main()
{
  int nuts[10] = {1,3,2,4,6,5,7,9,8,0};
  int bolts[10] = {7,4,1,8,5,2,9,6,3,0};

  sort(nuts,bolts,0,9);
}


相關推薦

演算法第二——Nuts and bolts螺絲螺帽

/*假設螺釘和螺帽大小沒有一樣的。 每次取nuts陣列中最後一個元素到bolts陣列中去找和它配對的元素,這樣可以避免nuts陣列中後部元素前移。*/ #include<iostream> using namespace std; int partition(int *nuts,int

『嗨威說』演算法設計與分析 - 演算法第二上機實踐報告二分查詢 / 改寫二分搜尋演算法 / 兩個有序序列的中位數

本文索引目錄: 一、PTA實驗報告題1 : 二分查詢   1.1  實踐題目   1.2  問題描述   1.3  演算法描述   1.4  演算法時間及空間複雜度分析 二、PTA實驗報告題2 : 改寫二分搜尋演算法   2.1  實踐題目   2.2  問題描述  

第二 線性表2鏈接表

first ppr bound 是否 class nds lang spl ado 3.5.2 鏈接表接口 鏈接表可以看成是一組結點序列以及基於結點進行操作的線性結果的抽象,或則說是對鏈表的抽象。 鏈接表的接口: 1 package com.datastructure

《生命》第二集:Reptiles and Amphibians 爬行兩棲動物

  第二集也是一個個動物的片段,不過集中在爬行和兩棲類動物上。     印度尼西亞的瀑布蟾蜍進化出神器強有力的腳,能夠抓牢很多物體,是逃生的手段,同一環境下,卵石蟾蜍,能夠縮緊全身肌肉,眼山坡下滑,是另一種逃生是手段。   巴西的沼澤中的凱門鱷獨特的守株待兔捕魚方法,也是他們聰明智慧的表現。耶穌蜥蜴,速度

第二 資訊處理表示2.1-ing

2.1資訊儲存 大多數計算機使用8位的塊,或者位元組,作為最小的可定址單位。機器級程式將記憶體視為一個非常大的位元組陣列,稱為虛擬記憶體。記憶體的每個位元組都由一個唯一的數字來標識,稱為它的地址,所有可能地址的集合就稱為虛擬地址空間。(C語言中一個指標的值都是某

第二 CSS工作原理剖析CSS規則

  一 簡述:CSS樣式與HTML的關係 第 1 章我們瞭解了怎麼通過 HTML 來建立文件結構。本章,我們來說一說 CSS 規則怎麼為 HTML 新增樣式,並解釋層疊的工作機制——當元素的同一個樣式屬性有多4 種樣式值的時候,CSS 就要靠層疊機制來決定最終應用哪種樣

Java語言程序設計第三版第二課後習題答案僅供參考

[] main 是否 支付 都去 port span 時區 div 2.1 註意不同類型轉換 1 import java.util.Scanner; 2 3 public class Ch02 { 4 public static void main

1.4 Installation and Setup安裝設定

1.4 Installation and Setup(安裝和設定) 這裡我們用Anaconda發行版作為Python的使用環境,推薦安裝Python3.6,本書就是用Python3.6程式碼寫成的。(譯者:我使用的也是Anaconda,Python版本是3.5,與3.6沒有任何使用上的差別) 譯者:針對不

啊哈演算法第二 佇列 先進先出—隊 先進後出—棧

小哈的QQ號  我的實現方法 #include <stdio.h> int data1[100]; void cleandata(int data[],int n); int main(){     int data1[100]={9,8,7,6,5

啊哈演算法第二 佇列

小哈的QQ號  我的實現 #include <stdio.h> int data1[100]; void cleandata(int data[],int n); int main(){

資訊學奧賽一本通C++版第二部分 基礎演算法 第二 資料排序

第二章 資料排序 T1310 : 車廂重組 時間限制: 1000 ms 記憶體限制: 65536 KB 【題目描述】   在一箇舊式的火車站旁邊有一座橋,其橋面可以繞河中心的橋墩水平旋轉。一個車站的職工發現橋的長度最多能容納兩節車廂,如果將橋旋轉180180

Coursera Algorithms week3 快速排序 練習測驗: Nuts and bolts

big rand [] .com .cn ash oal stat 決定 題目原文: Nuts and bolts. A disorganized carpenter has a mixed pile of n nuts and n bolts. The goal is t

演算法第二實踐上機實驗報告

題目:二分法查詢 問題描述:用二分法查詢x,找到時輸出x的下標和比較次數;找不到時輸出-1和比較次數。 演算法語言描述: 輸入陣列和要查詢的數x   演算法描述:將一個數組分為兩半,設定一箇中間量a[mid]與要查詢的數x比較,設定一個變量表示比較次數cnt,每次比較後

Best (and Free!!) Resources to Understand Nuts and Bolts of Deep Learning

The internet is filled with tutorials to get started with Deep Learning. You can choose to get started with the superb Stanford courses CS221&nbs

岡薩雷斯:數字影象處理第二數字圖形基礎——數學工具

陣列操作與矩陣操作的區別: 也就是說,除非特別說明,否則以後所提到的矩陣之間的操作都是元畫素與對應畫素之間的操作。 線性運算與非線性運算(和純數學裡面的定義相同): 例如,求和是線性運算,取最大值是非線性運算 灰度影象的集合與邏輯運算: 在灰度影象領域,集合的

岡薩雷斯:數字影象處理第二數字圖形基礎——影象內插,相鄰畫素,鄰接性,距離度量

1.影象內插:從根本上看,內插是用已知資料來估計未知位置的數值的處理。 例如,假設一幅大小為500500畫素的影象要放大1.5倍到75075畫素,一種簡單的放大方法是建立一個假想的750750網格,它與原始影象有相同的間隔,然後將其收縮,使它準確的與原影象匹配。顯然,收縮後的750750網格

“全棧2019”Java第二:安裝JDK11Windows

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 文章原文連結 “全棧2019”Java第二章:安裝JDK11(Windows) 下一章 “全棧2019”Java第三章:安裝開發工

Spring——第二 Spring與IoC

2.2.7  Bean的生命週期 Spring 內的Bean物件從建立到銷燬,可控點很多。 2.2.8 <bean>的id與name 屬性 name對格式沒有限制,id有 2.3 基於XML的DI 2.3.1 注入分類 設值注入:        基本

Spring——第二 Spring與IoC

cirl + shift + F 格式化程式碼 2.3.6 使用內部Bean注入 <bean id="myStudent" class="com.bjpowernode.di10.Student"> <property name="name

演算法第二作業

1、談一下對二分發思想的體會:首先二分法比較適用於查詢資料量大時,相比於按順序查詢,二分查詢的效率更高。但二分查詢中資料要先排好順序,再進行折半查詢,即每次查詢都會和中間的值進行比較,如果於中間值剛好相等,則查詢成功,如果不成功就將查詢的範圍縮小一半,依次遞迴即可,我覺得這就是二分法的精髓所在。2、結對程式設