排序算法小结(二)——交换类排序(Java实现):冒泡排序、快速排序

目录

1.冒泡排序

2.快速排序

3.总结


1.冒泡排序

起泡排序的思想非常简单。首先,将 n 个元素中的第一个和第二个进行比较,如果两个元素的位置为逆序,则交换两个元素的位置;进而比较第二个和第三个元素关键字,如此类推,直到比较第 n-1 个元素和第 n 个元素为止。

Java实现代码如下:

	public static void bubbleSort(int arr[]) {
		for(int i=0;i<arr.length-1;i++)//外层控制循环次数
			for(int j = 0;j<arr.length -i -1;j++) {
				if(arr[j]>arr[j+1]) {
					arr[j] = arr[j]+arr[j+1];
					arr[j+1] = arr[j]-arr[j+1];
					arr[j] = arr[j]-arr[j+1];
				}
			}
	}

2.快速排序

快速排序是将分治法运用到排序问题中的一个典型例子,快速排序的基本思想是:通过一个枢轴(pivot)元素将 n 个元素的序列分为左、右两个子序列 Ll Lr,其中子序列 Ll 中的元素均比枢轴元素小,而子序列 Lr 中的元素均比枢轴元素大,然后对左、右子序列分 别进行快速排序,在将左、右子序列排好序后,则整个序列有序,而对左右子序列的排序过程直到子序列中只包含一个元素时结束,此时左、右子序列由于只包含一个元素则自然有序。

用分治法的三个步骤来描述快速排序的过程如下:

1. 划分步骤:通过枢轴元素 x 将序列一分为二, 且左子序列的元素均小于 x,右子序列的元素均大于 x

2. 治理步骤:递归的对左、右子序列排序;

3. 组合步骤:无

从上面快速排序算法的描述中我们看到,快速排序算法的实现依赖于按照枢轴元素 x 对待排序序列进行划分的过程。

对待排序序列进行划分的做法是:使用两个指针 low high 分别指向待划分序列 r 的范围,取 low 所指元素为枢轴,即 pivot = r[low]。划分首先从 high 所指位置的元素起向前逐一搜索到第一个比 pivot 小的元素,并将其设置到 low 所指的位置;然后从 low 所指位置 的元素起向后逐一搜索到第一个比 pivot 大的元素,并将其设置到 high 所指的位置;不断重复上述两步直到 low = high 为止,最后将 pivot 设置到 low high 共同指向的位置。使用上述划分方法即可将待排序序列按枢轴元素 pivot 分成两个子序列,当然 pivot 的 选择不一定必须是 r[low],而可以是 r[low..high]之间的任何数据元素。

Java实现代码如下:

	private static int partition(int arr[],int low,int high) {//治理
		int pivot = arr[low];
		while(low<high) {
			while(low<high&&arr[high]>=pivot) high--;
			arr[low] = arr[high];
			while(low<high&&arr[low]<=pivot) low++;
			arr[high] = arr[low];
		}
		arr[low]=pivot;
		return low;
	}
	public static void quickSort(int arr[],int low,int high) {//递归排序
		if(low<high) {
			int pa = partition(arr, low, high);
			quickSort(arr, low, pa-1);
			quickSort(arr, pa+1, high);
		}
	}

3.总结

冒泡排序时间复杂度为O(n2),是一种稳定的排序算法;快速排序时间复杂度为O(N*logN),不稳定。选取10万个随机整数排序耗时测试如图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值