交换排序

有排序分类图:


今天主要分析交换排序,既冒泡排序和快速排序。

1.冒泡排序:

排序思路:冒泡法也叫下沉法。

                  第一趟:从第一个数开始,和下一个相邻的数比较,大的数往下“沉”;接着和下一个相邻的数比较,直至一个数组遍历完。

                  第二趟:从第一个数开始,除过已“下沉”的数,对剩下所有的数进行相邻两数比较,大的数往下“沉”。

                  .........

                  第n-1趟:以此类推,直到所有数都成为“下沉”数。

嗯哼,思路有点绕,不急,不急!还有图示法,^o^

假如有一组数据:263,29,6,3287,232,8;对其进行冒泡排序,如下图:


代码实现:

#include<stdio.h>

void BubbleSort(int arr[], int len)//冒泡排序
{
	int tmp;
	bool mark = false;

	for (int i = 0; i < len-1; i++)//趟数
	{
		mark = false;
		for (int j = 0; j < len - 1 - i; ++j)
		{
			if (arr[j]>arr[j + 1])
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				mark = true;
			}
		}

		printf("i = %d\n", i);
		if (!mark)
		{
			break;
		}
	}
}

int main()
{
	int arr[] = { 263,29,6,3287,232,8};
	int len = sizeof(arr) / sizeof(arr[0]);

	BubbleSort(arr, len);

	for(int i=0;i<len;i++)
	{
		printf("%d   ",arr[i]);
	}
	printf("\n");
	return 0;
}

2.快速排序

排序思路:分治法。在每一趟中,先选一个基准,在剩下的数中把比基准数小的数放到左边,大的数放到右边。

示例:有一组数据:263,29,6,3287,232,8,利用快速排序进行排序,图示如下:



代码实现:

#include<stdio.h>

int partition(int arr[], int low, int high)//对每一小组进行调整
{
	int tmp = arr[low];//tmp存放基准数
	while (low < high)
	{
		while (low < high && arr[high] >= tmp)high--;
		arr[low] = arr[high];//把比基准数小的数放在前边
		while (low < high && arr[low] <= tmp)low++;
		arr[high] = arr[low];//大的数放到后边
	}
	arr[low] = tmp;//把基准数插入到找到的位置
	return low;//返回当前基准点
}

void QSort(int arr[], int low, int high)//用递归对基准点左右进行分组
{
	if (low < high)
	{
		int boundKey = partition(arr,low, high);//找上一趟中基准点最后插入的位置

		QSort(arr,low,boundKey - 1);
		QSort(arr,boundKey + 1,high);
	}
}

void QuickSort(int arr[], int len)
{
	QSort(arr, 0, len - 1);
}

int main()
{
	int arr[] = {263,29,6,3287,323,8};
	int len = sizeof(arr) / sizeof(arr[0]);
	QuickSort(arr,len);

	for (int i = 0; i < len; ++i)
	{
		printf("%d  ",arr[i]);
	}
	printf("\n");
	return 0;
}
以上就是交换排序啦。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值