JAVA代码实现快速排序

快速排序

快速排序是一种改进版的冒泡排序。针对一组数据,按从小到大排序为例。首先随机选取一个数为基准(一般选取第一个数或者中间数)然后将数据分成左右两组,左边的每个数据都比基准小,右边的每个数据都比基准大。其实现思路是:

  1. 首先确定基准,然后确定左指针和右指针;
  2. 右指针先往左移动,找出比基准小的数的下标;
  3. 当右指针找到比基准小的数时,左指针开始向右移动,找到比基准打的数的下标;
  4. 如果左指针和右指针没有重合,就将各自找到的数进行交换位置;
  5. 重复2-4步,直到左右指针重合,一趟排序结束;
  6. 从指针位置分别进行左递归和右递归操作,直至排序完成。

快速排序的平均时间复杂度为O(nlogn),最差时间复杂度为O(n^2)。
我分别试了一下以第一个数、中间数和最后一个数为基准的方式,如有错误,还望指出,我会及时改正。代码如下:

package com.sort.quickSort;

import java.util.Arrays;

public class QuickSortDemo2 {

	public static void main(String[] args) {
		int[] array = new int[10];
		// 随机生成10个0~100至今的数
		int count = 0;// 记录有效的随机数个数
		boolean flag = true;// 用来标志的变量
		int num = 0;
		while (count < array.length) {
			num = (int) (Math.random() * 100);
			for (int i = 0; i < array.length; i++) {
				if (num == array[i]) {
					flag = false;
					break;
				}
			}
			if (flag) {
				array[count] = num;
				count++;
			} else {
				flag = true;
			}
		}
		System.out.println("排序前的数组:" + Arrays.toString(array));
		quickSort(array, 0, array.length - 1);

	}

	// 快速排序
	static int count = 0;

	public static void quickSort(int[] array, int begin, int end) {
		if (begin > end) {
			return;
		}
		// 1.将头尾暂存
		int left = begin;
		int right = end;
		// 2.选择基准
		int temp = array[begin];// 以第一个数为基准
		// int temp=array[(begin+end)/2];//以中间数为基准
		// int temp=array[end];//以最后一个数为基准
		while (left != right) {
			// 先让右指针往前移,每次要保证right>left
			// array[right]>temp:每次往前移动的时候,要么找到比基准小的数,要么找到基准的位置
			while (left < right && array[right] > temp) {
				right--;
			}
			// 再让左指针往后移,每次要保证right>left
			// array[left]<temp:每次往后移动的时候,要么找到比基准大的数,要么找到基准的位置
			while (left < right && array[left] < temp) {
				left++;
			}
			// 只要左右指针没有重合,就将两个指针找到的数互换位置
			// 1.如果左指针找到的数比基准大,右指针找到的数比基准小,互换位置
			// 2.如果左指针找到的是基准的位置,右指针找到的数比基准小,互换位置后,基准的最终位置只会在此或其之前了;
			// 3.如果左指针找到的数比基准大,右指针找到的是基准的位置,互换位置,基准的最终位置只会在此或其之后了;
			// 4.左右指针一旦重合,说明都找到了移动到了基准的位置,就不用了互换位置了
			if (left != right) {
				int i = array[right];
				array[right] = array[left];
				array[left] = i;
			}
		}
		// left和right就重合,表示一趟排序结束
		System.out.println("第" + (++count) + "趟排序后:" + Arrays.toString(array));
		// 分别向左和向右递归
		quickSort(array, begin, left - 1);
		quickSort(array, right + 1, end);
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章