各种排序方法比较

冒泡法

void sort(int *ar, int num)
{
	int i, j;		
	int t;
	int flag = 0;

	print(ar, num);
	for(i = 1; i < num; i++)	 //num个数需要排num - 1次
	{
		flag = 0;
		for(j = 0; j < num - i; j++)   //每次只需对前num - i个数排序
		{
			if(ar[j] > ar[j+1]) //如果第j个数比它后面一个数大,就要交换
			{
				t = ar[j];
				ar[j] = ar[j+1];
				ar[j+1] = t;
				flag = 1;
			}
		}
		if(flag == 0) //如果flag == 0表明本次排序没有经过一个交换,所以说明它己经有序了,就不用再循环
		{
			break;
		}
		print(ar, num);
	}
	print(ar, num);
}
-----------------------------------------------------------

简单排序法

void sort(int *ar, int num)
{
	int i, j, t, min;

	print(ar, num);

	for(i = 0; i < num - 1; i++)	
	{
		min = i;	 //假设最小的一个数的下标就是i
		for(j = i + 1; j < num; j++)
		{
			if(ar[min] > ar[j])
			{
				min = j; //用min保存最小的数的下标
			}
		}

		if(min != i)	 //把最小的那个数放到i这个位置
		{
			t = ar[min];
			ar[min] = ar[i];
			ar[i] = t;
		}
	}
	print(ar, num);
}
---------------------------------------------

插入排序算法

void sort(int *ar, int num)
{
	int i, j, t;

	print(ar, num);

	for(i = 1; i < num; i++)	 //取出第i个数,用来和它前面的i - 1个数进行比较
	{
		for(j = i - 1; j >= 0; j--)
		{
			if(ar[i] >= ar[j])	
				break;
		}
		if(j != i - 1)	
		{
			t = ar[i];
			memmove(&ar[j+2], &ar[j+1], (i - j - 1) * sizeof(int));  //把j之后的(i - j - 1)个数据通通向后移动一个位置
			ar[j+1] = t;
		}
		print(ar, num);
	}
	print(ar, num);
}
--------------------------------------------

快速排序算法

void sort(int *ar, int left, int right)
{
	int l = left, r = right;
	int t;
		
	if(r > l)
	{
		t = ar[l]; //从数组左边取一个数

		while(r > l)
		{
			while(r > l)
			{
				if(ar[r] <= t)	 //从右边找一个比t小的数
				{
					ar[l] = ar[r]; //把找到的数放到ar[l]中
					l++;		
					break;
				}
				r--;
			}

			while(r > l)	
			{
				if(ar[l] > t) //从右边找一个比t大的数
				{
					ar[r] = ar[l]; //把找到的数放到ar[r]中
					r--;
					break;
				}
				l++;
			}
		}	

		ar[l] = t; //把之前的t主回到最后空出来的那个位置

		sort(ar, left, l - 1);   //把序列的左半部份重复之前的排序
		sort(ar, l + 1, right);  //把序列的右半部份重复之前的排序
	}
}

-----------------------------------------

二分法查找

int bfind(int* a,int len,int val)
{
    int m = len/2;
    int l = 0;
    int r = len;
    while(l!=m && r!= m)
    {
        if(a[m] > val)
        {
            r = m;
            m = (m+l)/2;
        }
        else if(a[m] < val)
        {
            l = m;
            m = (m+r)/2;
        }
        else
            return m;
    }
    return -1;   //没有找到
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值