欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

排序算法之快速排序

程序员文章站 2022-06-04 15:04:51
...

快速排序

        快排(简称)是一种分而治之的算法,即就是将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另外一部分的所有数据要小,按照这种方法对这两部分分别进行快排,重复实现此过程,最后实现整个数据变成有序序列

        快排的步骤如下:

        以数组a[8]={50,80,95,10,4,56,2,48}为例(数组在程序中可自行输入)

        首先从数组中任意选取一个数据(通常选作第一个数据)作为关键数据,然后将所有比它小的数都放在它的前面,比它大的数都放在它的后面,此过程为一趟快排,其算法如下:

            1.设置两个变量left、right,排序开始的时候,left=1,right=数组长度-1;

            2.以第一个数组元素作为关键数据,赋值给x

            3.让right从后向前搜索,遇到第一个小于x的值,将两者交换,right--

            4.让left向后搜索,遇到第一个大于x的值,将两者交换,left++

            5.重复3,4过程,直到left==right,一趟快排结束

       一趟排序的图解过程如下:

      排序算法之快速排序

完整代码如下:

package wang.second;

public class DemoB {

	public static void pintArray(int[] a) {
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
	}

	private static void swap(int[] a, int i, int j) {
		int t = a[i];
		a[i] = a[j];
		a[j] = t;
	}

	public static void quickSort(int[] a, int left, int right) {
		int i = left;
		int j = right;
		boolean t = true; // 作为左右交换遍历 的标志
		if (i >= j)
			return;
		while (i < j) {
			if (a[i] > a[j]) {
				swap(a, i, j);
				t = t ? false : true;
			}
			// 决定右移还是很左移
			if (t)
				j--; // 从右向左找第一个小于关键值的数据
			else
				i++; // 从左向右找第一个大于关键值得数据

			// 将数组分成两部分,分别对这两部分进行排序

		}
		quickSort(a, 0, i - 1);// 左半部分
		quickSort(a, j + 1, right);// 右半部分
	}

	public static void main(String[] args) {
		int[] a = new int[] { 50, 80, 95, 10, 4, 56, 2, 48 };
		System.out.println("排序之前的数组");
		pintArray(a);
		// 快速排序
		System.out.println("\n排序之后的数组");
		quickSort(a, 0, 7);
		pintArray(a);
	}
}

 

相关标签: 快速排序