寧德住房和城鄉(xiāng)建設(shè)部網(wǎng)站怎樣做網(wǎng)絡(luò)推廣營(yíng)銷
負(fù)數(shù)移到正數(shù)前面
已知順序表 ( a 1 , … , a n ) (a_{1},\dots,a_{n}) (a1?,…,an?),每個(gè)元素都是整數(shù),把所有值為負(fù)數(shù)的元素移到全部正數(shù)值元素前邊
算法思想
快排的前后指針版本
排序|冒泡排序|快速排序|霍爾版本|挖坑版本|前后指針版本|非遞歸版本|優(yōu)化|三數(shù)取中?-CSDN博客
前后兩個(gè)指針往后走
cur找負(fù)數(shù),++prev,交換prev和cur的值
prev有兩種情況:
- 在cur還沒遇到正數(shù)的時(shí)候,prev緊跟著cur
- 在cur遇到正數(shù)的時(shí)候,prev在一組正數(shù)的前面
交換:把正數(shù)往后推,把負(fù)數(shù)往前甩
本質(zhì)是把一段正數(shù)的區(qū)間,推箱子似的往右推,同時(shí)把負(fù)數(shù)甩到左邊去
int Rearrange(SqList a, int n)
{int prev = 0; //指針 prev,用于記錄負(fù)數(shù)區(qū)間的最后一個(gè)負(fù)數(shù)int cur = 0; //指針 cur,用于遍歷數(shù)組中的每個(gè)元素while (cur < n) //繼續(xù)遍歷直到 cur 超出數(shù)組范圍{if (a[cur] < 0) //如果當(dāng)前元素為負(fù)數(shù){Swap(&a[prev++], &a[cur]); //將負(fù)數(shù)放到負(fù)數(shù)區(qū)間的末尾}++cur; //移動(dòng) cur 到下一個(gè)元素}return prev; //返回負(fù)數(shù)區(qū)間的結(jié)束位置
}
cur指向的是負(fù)數(shù),與prev交換,prev++
cur++,判斷下一個(gè)元素
為3,cur繼續(xù)往下遍歷
cur指向-4,與prev交換,prev++
cur++
指向-1,與prev交換,prev++
cur++
為6,結(jié)束循環(huán)
小于x移到大于x前面
設(shè)有一元素為正數(shù)的線性表L(a1,a2,…,an),存放在一維數(shù)組A[N]
中,以an作為參考元素,將該表分為左右兩部分,左半部分的每個(gè)元素小于等于an,右半部分每個(gè)元素都大于an,an位于分界位置上,并把結(jié)果仍存放在A[N]
中
int Rearrange(int a[], int n)
{int prev = 0; //指針 prev,用于記錄小于an區(qū)間的最后一個(gè)負(fù)數(shù)int cur = 0; //指針 cur,用于遍歷數(shù)組中的每個(gè)元素int keyi = n - 1;while (cur < n) //繼續(xù)遍歷直到 cur 超出數(shù)組范圍{if (a[cur] < a[keyi]) //如果當(dāng)前元素小于an{Swap(&a[prev++], &a[cur]); //將其放到前半部分區(qū)間的末尾}++cur; //移動(dòng) cur 到下一個(gè)元素}//只有在 prev 不等于 keyi 時(shí)才交換if (prev < keyi){Swap(&a[prev], &a[keyi]);}return prev; //返回小于an的元素?cái)?shù)量
}
奇數(shù)移到偶數(shù)前面
已知線性表按順序存儲(chǔ),且每個(gè)元素都是整數(shù)均不相同,把所有奇數(shù)移到所有偶數(shù)前邊
思想同上
int Rearrange(SqList a, int n)
{int prev = 0; //指針 prev,用于記錄負(fù)數(shù)區(qū)間的最后一個(gè)負(fù)數(shù)int cur = 0; //指針 cur,用于遍歷數(shù)組中的每個(gè)元素while (cur < n) //繼續(xù)遍歷直到 cur 超出數(shù)組范圍{if (a[cur] % 2 != 0) //如果當(dāng)前元素為奇數(shù){Swap(&a[prev++], &a[cur]); //將奇數(shù)放到前半?yún)^(qū)間的末尾}++cur; //移動(dòng) cur 到下一個(gè)元素}return prev; //返回奇數(shù)區(qū)間的結(jié)束位置
}