阅读背景:

希尔排序&选择排序&时间复杂度分析

来源:互联网 
#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



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: