分解数组,使左边的元素小于或等于0,右边的大于0
问题描述:实现一个算法,把一个顺序表分解成两个部分,使顺序表中小于或等于0的元素位于左边,大于0的元素位于右边。要求不占用额外的储存空间。
算法思想:设置两个指示器i和j,分别扫描顺序表中的元素,i和j分别从顺序表的左边和右边开始扫描。如果i遇到小于或等于0的元素,略过不做处理,继续向前扫描;如果遇到大于0的元素,暂停扫描。如果j遇到大于0的元素,略过不做处理,继续向前扫描;如果遇到小于或等于0的元素,暂停扫描。如果i和j都停下来,则交换i和j指向的元素。重复执行直到(i>=j)为止。
void splitSeqList(int* a, int n) // a表示传入的数组,n表示数组的大小
{
for (int i{0}, j{n - 1}; i < j;) {
for (; a[i] <= 0; i++); // 找到从左边开始扫描的第一个大于0的元素
for (; a[j] > 0; j--); // 找到从右边开始扫描的第一个小于或等于0的元素
if (i < j) { // 若此时(i < j), 则交换这两个元素
e = a[i];
a[i] = a[j];
a[j] = e;
}
}
}