由于没有要求大小顺序,只是要求了正负次序。可以参考快速排序,设置三个指针i,j,k。
j为工作指针扫描整个数组,i之前的数全为负,k之后的数全为正。
具体代码实现如下:
#include<iostream>
using namespace std;
int case_id(int i)
{
if(i < 0)
return -1;
else if(i == 0)
return 0;
else
return 1;
}
void swap(int &i, int &j)
{
int t = i;
i = j;
j = t;
}
void sort(int a[], int n)
{
// 设置三个指针,j为工作指针,i之前的全为负,k之后的全为正
int i = 0, j = 0, k = n-1;
while(j <= k)
{
int case_num = case_id(a[j]);
switch(case_num)
{
case -1: swap(a[i], a[j]); i++; j++; break;
case 0: j++; break;
case 1: swap(a[j], a[k]); k--; break;
}
}
}
int main()
{
int n = 10;
int a[] = {-5, 9, 4, 0, 8, -2, 0, 6, -1, 3};
// 输出初始数组
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
// 排序
sort(a, n);
// 输出排序后的数组
cout << "after sort" << endl;
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
代码中示例的输出为:
-5 9 4 0 8 -2 0 6 -1 3
after sort
-5 -1 -2 0 0 8 6 4 3 9