对N个关键字取整数的记录进行整序,以使所有关键字为非负数的记录排在关键字为负数的记录之前,要求使用最少的附加空间,且算法的时间复杂度为O(N)。
输入:
先输入数据的个数
输入准备排序的数据,以空格间隔
输出:
输出排好的数据
存储结构:
顺序存储结构
算法的基本思想:
排序:从序列开头开始,先找到第一个负数,标记位置后,再从最后一个位置开始找第一个非负数,与前面的负数交换位置,然后再从负数的位置重复上述过程,直到最后一个元素。
代码
#include<bits\stdc++.h>
using namespace std;
void sort(int *a, int n)
{
int i=0;
int j=n-1;
int t;
while(i<=j)
{
while(i<n&&a[i]>=0)
{
i++;
}
while(j>=0&&a[j]<0)
{
j--;
}
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
}
}
}
int main()
{
system("color f0");
int n,i;
int* p;
printf("Please input n:\n");
scanf("%d",&n);
p=(int*)malloc(n*sizeof(int));
printf("Please input array:\n");
for(i=0;i<n; i++)
{
scanf("%d", &p[i]);
}
sort(p,n);
printf("Adjusted array:\n");
for(i=0;i<n;i++)
{
printf("%-4d",p[i]);
}
printf("\n");
system("pause");
return 0;
}
结果截图
此程序的优点是算法简单,便于操作和理解其缺点是空间复杂度不是很好。时间复杂度:O(N),空间复杂度为O(1)。(题中还进行了大小的排序,这样的话时间复杂度会变为O(n^2))