題目描述
輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。(相對位置:兩數之間位置,比如:{1,2,3,4,5},偶數間,2的相鄰偶數為4,那麼調整陣列後,2的相鄰偶數也必須為4)。
思路:
用兩個索引,乙個指向陣列的第乙個數字,把第二個索引指向陣列的最後乙個數字,然後第乙個索引往後移動,直到碰到第乙個偶數,第二個索引往前移動,指導碰到第乙個奇數,如果第乙個索引小於第二個索引,那麼就交換兩個索引的值,然後重複上述操作,直到第乙個索引大於第二個索引,結束操作,此時,陣列中所有的奇數都將位於偶數前面。
例如:有一陣列,現第乙個索引指向陣列中的第乙個數1,第二個索引指向陣列的最後乙個數8,第乙個索引開始往後移動,找到第乙個偶數,此時,索引指向的值為2。第二個索引開始移動,直到遇到第乙個奇數,此時第二個索引指向的值為7,因為此時第乙個索引所指值的下標為1,小於第二個索引所指值得下標6,所以交換2和7得位置,此時陣列內容為:.
按照上述操作,重複直到第乙個索引小於第二個索引,結束迴圈,陣列得調整完成。
以下有三種解決該操作的方法。其中第一種和第二種的時間複雜度與空間複雜度皆小於第三種方法,但是由於前兩種方法無法解決數字間的相對位置不變,由此需要使用第三種方法來解決相對位置不變的問題。相對於最基本的思想:「從頭遍歷陣列,每遇到乙個偶數,就把後面的數往前移,最後空出的位置插入遇到的偶數。」第三種方法有點空間換時間的概念,直接用兩個陣列來儲存奇偶數,然後遍歷完陣列之後再把偶數陣列的值插入奇數陣列中,時間複雜度o(n)。
using system;
namespace 調整陣列順序使奇數字於偶數前面
; console.write("\nago:");
printarray(arr1);
console.write("\nafter:");
printarray(reorderarray3(arr1));
//test2
console.writeline("\ntest2:");
int arr2 = ;
printarray(reorderarray1(arr2));
//tes3
console.writeline("\ntest3:");
console.writeline("ago:");
printarray(arr1);
console.writeline("after:");
int arr3 = ;
printarray(reorderarray2(arr3));
}/// /// 用於重新排列奇偶數在陣列中的順序,但是該函式無法控制偶數與偶數、奇數與奇數間的相對位置
///
/// 調整的陣列
///
public static int reorderarray1(int array)
}return array;
}//宣告乙個指向函式的委託,用於在函式reorderarray2中呼叫委託作為形參使用
private delegate bool event(int n);
/// /// 用於潘昕排列奇偶數在陣列中的位置,依然無法控制偶數與偶數、奇數與奇數之間的相對位置。但是相對於reorder array1來說,reorder array2減少了資料間的耦合性,可以把isevent作為乙個標準,如果排列的條件做了改變,只需要重新編寫乙個標準(重寫isevent)即可實現新的功能模組,提高了**的重用性,為功能擴充套件提供了便利
///
/// 用於調整的陣列
///
public static int reorderarray2(int array)
/// /// 此函式是把reorderarray1分解成兩部分的第一部分,用於判斷數字應該在陣列前半部分還是後半部分
///
/// 調整的陣列
/// 分組的標準,可以重寫標準來改變函式的分組
///
private static int reorder(int array,event isevent)
/// /// 用於測試的乙個新標準,把能整除3的值列為乙個新的分組放在陣列的後面
///
/// 傳入需要判斷的數
///
private static bool isevent2(int n)
public static int reorderarray3(int array)
else
oushu[ou++] = array[i];
}for(int i = 0; i < ou; i++)
return arr;
}private static void printarray(int array)}}
}
調整陣列順序使奇數字於偶數前面
題目 輸入乙個整數陣列,調整陣列中數字的順序,使得所有奇數字於陣列的前面部分,偶數字於陣列的後面部分。思路 要求時間複雜度是 n 1 從頭開始掃瞄陣列,確定數是奇數不動,偶數的話就移動陣列最後。這樣每個偶數都要進行移動,最壞的時間複雜度達到 n 2 2 用兩個指標,頭指標指向陣列開始,尾指標指向陣列...
調整陣列順序使奇數字於偶數前面
1 題目 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分。2 解題思路 2.1 最簡單思路,時間複雜度o n2 從頭掃瞄這個陣列,每碰到乙個偶數時,拿出這個數字,並把位於這個數字後面的所有數字往前挪動一位。挪完之後在陣列的末尾有乙個...
調整陣列順序使奇數字於偶數前面
題目描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。輸入 每個輸入檔案包含一組測試案例。對於每個測試案例,第一行輸入乙個n,代表該陣列中數字的個數。接下來的一行輸入n個整...