輸入一個整數(shù)數(shù)組,實現(xiàn)一個函數(shù)來調(diào)整改數(shù)組中數(shù)字的順序梳杏。使得所有奇數(shù)位于數(shù)組的前半部分。偶數(shù)位于數(shù)組的后半部分淹接。
- 思路1: 遍歷數(shù)組十性,如果當(dāng)前數(shù)字為偶數(shù),則把它之后的所有數(shù)字均向前移動一位塑悼,然后當(dāng)前數(shù)字移動到末尾劲适。這樣的時間復(fù)雜度為O(n2)。
- 思路2: 分別使用2個指針厢蒜,一個指針指向數(shù)組的頭部霞势,一個指向數(shù)組的尾部烹植。比較頭指針和尾指針指向的數(shù)值。如果頭指針指向的是奇數(shù)則頭指針向后移動支示,直到指向偶數(shù)刊橘。如果尾指針如果指向偶數(shù),則一直向前移動颂鸿,直到指向奇數(shù)促绵。
void sorted(int*array,int length){
if (array == nullptr || length ==0) {
return;
}
int*pBegin = array;
int*pEnd = array+ length-1;
//1.只要尾指針大于頭指針跳出 2.只要頭指針指向奇數(shù)就向后移動,只要尾指針指向偶數(shù)就向前移動 3.只要頭指針大于尾指針就交互兩個指針指向的值
while (pBegin<pEnd) {
//如果是奇數(shù)則一直走嘴纺。直到走
while (pBegin<pEnd&&(*pBegin&0x1)!=0) {
pBegin++;
}
//偶數(shù)則一直走败晴,直到遇到奇數(shù)
while (pBegin<pEnd&&(*pEnd&0x1)==0) {
pEnd--;
}
if (pBegin<pEnd) {
int numbers = *pBegin;
*pBegin = *pEnd;
*pEnd = numbers;
}
}
}
現(xiàn)在我們要讓排序規(guī)則改變。我們要把規(guī)則抽象出來栽渴。抽象成一個函數(shù)指針尖坤。
void sorted(int*array,int length,bool(*func)(int)){
if (array == nullptr || length ==0) {
return;
}
int*pBegin = array;
int*pEnd = array+ length-1;
//1.只要尾指針大于頭指針跳出 2.只要頭指針指向奇數(shù)就向后移動,只要尾指針指向偶數(shù)就向前移動 3.只要頭指針大于尾指針就交互兩個指針指向的值
while (pBegin<pEnd) {
//如果是奇數(shù)則一直走闲擦。直到走
while (pBegin<pEnd&& !func(*pBegin)) {
pBegin++;
}
//偶數(shù)則一直走慢味,直到遇到奇數(shù)
while (pBegin<pEnd&&func(*pEnd)) {
pEnd--;
}
if (pBegin<pEnd) {
int numbers = *pBegin;
*pBegin = *pEnd;
*pEnd = numbers;
}
}
}
bool isEvent(int a){
return (a&0x1)==0;
}