算法思想
设立三个指针i,j,k。其中,j代表工作指针,表示当前扫描到的元素,i以前的元素全部为负数,k之后的元素全部为正数。
根据j所指元素值A[j]:
①如果A[j]<0,那么和A[i]交换;
②如果A[j]==0,那么不交换,j++即可;
③如果A[j]>0,那么A[j]和A[k]交换。
主要代码
void NumberArrange(int A[],int n){
int i = 0,j = 0,k = n - 1;
while(j <= k){//循环跳出条件
if(A[j] < 0){//若A[j]<0
Swap(A[i],A[j]);//交换A[i]和A[j]
i++;
j++;
continue;
}else if(A[j] == 0){//若A[j] == 0,不交换,指针j后移
j++;
continue;
}else{//若A[j]>0
Swap(A[j],A[k]);//交换A[j]和A[k]
k--;//为了防止A[j]和A[k]交换后A[j]处仍为正数,所以没有让j++
// 为什么A[j]<0的时候,j可以后移呢?因为j在i后面,i所指元素都是j处理过的
// 所以i所指元素只能为0
continue;
}
}
}
测试程序
#include<iostream>
#include<stdlib.h>
using namespace std;
void Swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
void PrintArray(int A[],int n){
for(int i = 0;i < n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
void NumberArrange(int A[],int n){
int i = 0,j = 0,k = n - 1;
while(j <= k){//循环跳出条件
if(A[j] < 0){//若A[j]<0
Swap(A[i],A[j]);//交换A[i]和A[j]
i++;
j++;
continue;
}else if(A[j] == 0){//若A[j] == 0,不交换,指针j后移
j++;
continue;
}else{//若A[j]>0
Swap(A[j],A[k]);//交换A[j]和A[k]
k--;//为了防止A[j]和A[k]交换后A[j]处仍为正数,所以没有让j++
// 为什么A[j]<0的时候,j可以后移呢?因为j在i后面,i所指元素都是j处理过的
// 所以i所指元素只能为0
continue;
}
}
}
int main(){
int A[10] = {1,2,-1,0,-2,4,5,-5,9,0};
printf("排序前:");
PrintArray(A,10);
NumberArrange(A,10);
printf("排序后:");
PrintArray(A,10);
return 0;
}