C++ 將序列前半部分為負整數,後半部分為正整數(資料分類)
阿新 • • 發佈:2019-01-07
一、題目:
將序列前半部分為負整數,後半部分為正整數,不要求排序,但要求儘量減少交換次數。
二、思路:
首先,從陣列0開始往後找第一個正整數位置pos;然後,從陣列len-1開始往前找第一個負整數位置neg;
接著,交換這兩個數。pos往後找,neg往前找。重複前面步驟,直到pos>=neg結束。
三、實現程式
#include <iostream> // 交換兩個數 void Swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; } // 將負整數放在左邊,正整數放在右邊 int divPosNeg(int arr[], int len) { int neg = len-1, pos = 0; // neg,pos分別儲存找到的負整數和正整數的位置 int i, count = 0; // count記錄交換次數 while(pos < neg) { for(i = pos; i < len; i++) // // 往右掃描,找到第一個正整數 if(arr[i] > 0) { pos = i; break; } // 從右邊開始找第一個負數 for(int i = neg; i >= 0; i--) if(arr[i] < 0) { neg = i; break; } Swap(arr[pos], arr[neg]); // 交換 count++; pos++; neg--; } return count; } int main(int argc, const char * argv[]) { // insert code here... int arr[] = {10, 10, -20, 30, 40, -50, 60, -70, 80, -90, -100}; int len, i, count; len = sizeof(arr) / sizeof(arr[0]); // 獲取整個陣列的長度 // 輸出分類前 for(i = 0; i < len; i++) std::cout << arr[i] << " "; std::cout << std::endl; count = divPosNeg(arr, len); // 呼叫資料分類函式 for(i = 0; i < len; i++) std::cout << arr[i] << " "; std::cout << std::endl; std::cout << "交換的次數:" << count << std::endl; return 0; }
執行結果: