#include <stdio.h>
#include <stdlib.h>
void shellsort(char array[],int len);
void selectsort(char array[],int len);
void swap(char *a,char *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}//好多傻逼面试都考这种写法,岂不知这种写法在a,b是一个数时有bug:假设a=6,a=a^a=(0b110)^(0b110)=0,a=a^a=(0b000)^(0b000)=0,a=a^a=0(同上)
//或者
void swap1(char *a,char *b)
{
*a += *b;
*b -= *a;
*a -= *b;
}//a=2a;a=a;a=0 bug一样存在
//所以多写一个temp不会死,并不是什么都能优化的
main()
{
char c;
int i=0,len=0;
int test=6;
char array[100];
memset(array,0,100);
while((c=fgetc(stdin))!=EOF)//&&c!='\n')
{
len++;
array[i++]=c;
}
// shellsort(array,len);
selectsort(array,len);
for(i=0;i<len;i++)
fputc(array[i],stdout);
//swap(&test,&test);
swap1(&test,&test);
printf("\n%d",test);
}
void shellsort(char array[],int len)
{
int gap,i,j;
for(gap=len/2;gap>0;gap/=2)//3,3,4,1,4
{
for(i=gap;i<len;i++)//插入排序的一种简洁写法,好像是算法导论上的
{
for(j=i-gap;array[j+gap]<array[j]&&j>=0;j-=gap)
{
swap(&array[j+gap],&array[j]);
}
}
}
}
void selectsort(char array[],int len)
{
int i,j,min;
for(i=0;i<len;i++)
{
min=i;
for(j=i+1;j<len;j++)
{
if(array[j]<array[min])
{
min=j;
}
}
if(min!=i)
{
swap(&array[i],&array[min]);
}
}
}
//选择排序时间复杂度分析:最好最坏情况最内层的循环平均执行N/2次(必须比较j和min处元素的值),外层循环执行N次,所以复杂度O(N^2)#include <stdio.h>
#include <stdlib.h>
void sh