数据结构排序算法-快速排序

快速排序

思路:
在一个序列中,随意取一个数值作为标准,将序列划分为两部分,左边一部分是小于这个标准值的,右边一部分是大于这个标准值的。
后序接着如此排序,直至序列排好序为止。
数据结构排序算法-快速排序
下标为0的位置是监视哨,也就是存放标准的位置。然后从j所指向的位置向前查找,只要是比49小的值就放在前面,这里27小于49,那么将27移到前面。将27存放到元素指向的位置。
接着i向后移动,38小于49,那么不变,65大于49,所以将65移动到27的位置,因为27刚才移动到了i元素的位置,现在27这个位置是空的。所以可以存放。
数据结构排序算法-快速排序
当 i 和 j 相等的时候,就将标准值存放在这个空的位置。
一趟快速排序就结束了。
从前往后找大的,从后往前找小的。直到 i 不小于 j 的时候。此趟快速排序结束。

Java实现代码

package com.xingyun.paixu;

/**
 * 快速排序
 * 
 * @author lenovo
 *
 */
public class KuaiSuPaiXu {

	public static void main(String[] args) {
		// 定义将要进行排序的序列
		int[] stu = { 49, 38, 65, 97, 76, 13, 27, 49 };
		// 调用快速排序算法
		KuaiPai(stu, 0, stu.length - 1);
		for (int m : stu) {
			System.out.print(m + "\t");
		}
	}

	public static void KuaiPai(int[] stu, int l, int h) {
		// 如果排序的起始下标已经大于或等于终止下标,那么说明已经排序完毕
		if (l < h) {
			// 获得本次排序后的序列的分界线
			int k = KuaiPai01(stu, l, h);
			// 左半部分进行排序
			KuaiPai(stu, l, k - 1);
			// 有半部分进行排序。
			KuaiPai(stu, k + 1, stu.length - 1);
		}
	}

	// 快速排序的主要实现方法。i为每趟排序的初值,j为每趟排序的终止(都是在数组长度范围内的值)
	public static int KuaiPai01(int[] stu, int i, int j) {
		// 将当前下标为i的数组元素的值作为标准,也就是每一次要进行快速排序的数组的第一个元素。
		int k = stu[i];
		// 当起始位置>=终止位置的时候,说明此趟排序已经结束
		while (i < j) {
			//里面两个的条件都有i<j,因为内部都在改变这两个变量
			// 从后向前找,先找最后一个元素,判断是否小于标准值,
			while (i<j&&stu[j] >= k) {
				j--;
			}
			// 跳出循环说明找到了比标准值小的值,或者查找结束,
			// 如果小于标准值,将该值直接放置在标准值所在的位置上,因为标准值已经存放在k中,不怕被覆盖
			stu[i] = stu[j];
			// 从前向后找,判断是否大于标准值,因为上面的while循环会改变j的值,所以此处应该再次判断i和j的情况
			while (i < j && stu[i] <= k) {
				i++;
			}
			// 跳出循环说明找到了比标准值大的值,或者查找结束,
			// 就应该移动到上面j元素的位置,因为j元素语句移动到了标准值存放的位置了,所以可以直接覆盖
			stu[j] = stu[i];
		}
		// 最后将k中记录的标准值移入数组中最后一次被移走的下标为i的数组空间。
		stu[i] = k;
		// 返回本趟排序结束时标准值的位置,序列的分界线。
		return i;
	}
}

算法分析

数据结构排序算法-快速排序数据结构排序算法-快速排序

数据结构排序算法-快速排序数据结构排序算法-快速排序 ™清ク欢ガ度℡ 发布了27 篇原创文章 · 获赞 0 · 访问量 1279 私信 关注
上一篇:Ubuntu 16.04.5 操作系统,mount不能挂载磁盘


下一篇:centos8建shdow