排序--1


void swap (int a[], int i, int j)
{
	int tmp  = a[i];
	a[i]     = a[j];
    a[j] = tmp;
}



void printA(int a[], int len)
{
	int  i;
	for (i = 0; i < len; i++)
		printf ("%-4d",a[i]);
	printf ("\n");
}

鸡尾酒排序:

int main()
{
	int a[10]= {0,0,0,0,5,4,77,2,1,0};
	int len =sizeof (a) / sizeof(a[0]);
	int i;
	int left = 0;
	int right = len - 1;
	
	while (left < right)
	{
		for (i = left; i < right; i++)
		{	
			if (a[i] > a[i + 1])
				swap (a,i, i + 1);
		}
		right--;
		for (i = right; i > left; i--)
		{	
			if (a[i - 1] > a[i])
				swap (a,i - 1, i);
		}
		left++;
		
	}
	printA (a,len);
}
鸡尾酒排序的思路在于,向右排序一次将最大的比较之后放在最后,返回向前,将最小的放在第一个,再向后至倒数第二个将次大的放在那儿,再回头。直到中间。问题的关键在我们需要两个下标,分在两个边界,让数组在此循环。



插入排序:

int main()
{
	int a[10]={0,0,0,0,5,4,77,2,1,0};
	int len =sizeof (a) / sizeof(a[0]);
	int i,j;
	int get;
	for (i = 1;i < len; i++)        //默认第一个已经排好序,从第二个开始比较
	{                               //第二个与前面每个都比较,找到第一个比自己小的
		get = a[i];                 // 插入到右边
		j  = i - 1;
		while (j >= 0 && a[j] > get)
		{
			a[j + 1] = a[j];
			j--;
		}
	    a[j + 1] = get;
		
	}
	
	printA (a,len);
	return 0;	
}
插入排序的思路在于,将第一个数放置,取第二个数比较,比之大,放后,反之放前。程序中我们找比之小的数,放在这个数的右边。

值得我们借鉴的方法是,从右边开始依次比较,并且将不符合要求的全部后移,直到满足要求的时候,也腾出了位置。此思路如果从左边开始寻找位置,寻找位置没有问题,但是移动很花时间。




二分插入排序:

int main()
{
	
	int a[10]= {0,0,0,0,5,4,77,2,1,0};
	int len =sizeof (a) / sizeof(a[0]);
	int i,j;
	int mid,left,right,get;
	
	for (i = 1; i < len; i++)
	{
		get = a[i];
		left  = 0;
		right = i - 1; 
		//mid =(left + right) / 2;       //要在二分之后才能用这个式子
		while (left <= right)
		{
			mid =(left + right) / 2;
			if (a[mid] > get)
			   right = mid - 1;
		   else
			   left  = mid + 1; 
		}
	
	for (j = i-1; j >= left; j--)
	{
		a[j + 1] = a[j];
		
	}
	a[left] = get;
	}
		printA (a,len);	
}

这个程序中很多条件需要自己慢慢体会,需要自己代入数值进行比较判断。首先,这个程序先将数组二分,圈出要排的数的位置,其次在此基础上再二分,圈出位置,注意条件right = mid - 1;left = mid + 1;这两个是保证循环开始又是保证循环结束的重要条件,不断的二分,确定合适的边界,最终找出确定的位置,是这个排序的思路所在。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值