最近在做树状数组的逆序数,其实早就发现了qsort的局限性:即数组a[n]排序必须从0开始,如果从1开始到n,会出现某一项为0的情况。导致树状数组中lowbit完全没法求,无奈只能去学习了一下C++中sort函数
#include<stdio.h>
#include<algorithm> //这是sort的头文件
using namespace std; //这个必须加
bool cmp(int a, int b) //cmp是由bool定义的
{
return a < b;//从小到大与qsort相同
}
int main()
{
int a[100];
int i;
for (i = 1; i <= 5; i++)
scanf("%d", &a[i]);
sort(a + 1, a + 6,cmp);
//关键在这里,可以调整排序范围,注意这里上界是a+n+1,因为算法的区间是半开半闭的,前面闭后面开。这样的设计是整个stl的设计原则决定的
for (i = 1; i <= 5; i++)
printf("%d ", a[i]);
return 0;
}
纯C果然还是有种种不便之处,下个暑假还是有必要学习一下C++
在做题的时候发现了qsort的补缺陷法,其实根本没有缺陷,只不过我水平太差,只要改变qsort的开始位置,原本a的意思是从a[0]开始(指针嘛),现在改为a+n,就是从a[n]开始了
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
int main()
{
int n;
int a[100];
while (scanf("%d", &n), n)
{
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
qsort(a + 1, n, sizeof(a[0]), cmp);//a+m指从a[m]开始
for (int i = 1; i <= n; i++)
printf("%d ", a[i]);
printf("\n");
}
return 0;
}