快速排序
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。
平均复杂度 : nlog2n 最坏时间复杂度 : n^2 最好时间复杂度 : nlog2n 空间复杂度: log2n 稳定性: 不稳
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| package com.xiaohu.suanfa.sort;
import java.util.Arrays; import java.util.Scanner;
public class QuickSort { public static void main(String[] args) { print(); }
private static int[] getArray() { Scanner sc = new Scanner(System.in); System.out.println("请输入一串数字,以,为 间隔"); String str = sc.nextLine(); String[] strArray = str.split(","); int[] arr = new int[strArray.length]; for (int i = 0; i < strArray.length; i++) { arr[i] = Integer.parseInt(strArray[i]); } return arr; }
private static void print() { int[] array = getArray(); System.out.println("排序之前的数组:" + Arrays.toString(array)); long startTime = System.currentTimeMillis(); int[] sort = sort(array, 0, array.length - 1); long endTime = System.currentTimeMillis(); System.out.println("排序之后的数组:" + Arrays.toString(sort)); System.out.println("总共花费:" + (endTime - startTime) + "毫秒"); }
private static int[] sort(int[] arr, int low, int high) {
int key = 0; int i = low; int j = high; if (i < j) { key = arr[i]; while (i < j) {
while (key <= arr[j] && i < j) { j--; } arr[i] = arr[j]; while (key >= arr[i] && i < j) { i++; } arr[j] = arr[i]; } arr[i] = key; sort(arr, low, i - 1); sort(arr, i + 1, high); }
return arr; } }
|