快速排序,选择排序

来源:互联网 发布:找图片的软件 编辑:程序博客网 时间:2024/04/30 07:25
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n)。 选择排序是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。package com.test;public class TestSort {public static void main(String[] args) {// TODO 自动生成方法存根int[] d = { 0, 9, 22, 5, 4, 33, 6, 8, 7, 1, -5, 22 };//插入排序insertionsort(d);////选择排序//selectionsort(d);////冒泡排序//bubblesort(d);////快速排序//QuickSort(d);////优化快速排序//OptimizeQuickSort(d);for (int i = 0; i < d.length; i++) {System.out.print(d[i] + "  ");}}/** * 插入排序 */public static void insertionsort(int[] data) {int tmp;int i, j;for (i = 1; i < data.length; i++) {tmp = data[i];for (j = i; j > 0 && tmp < data[j - 1]; j--)data[j] = data[j - 1];data[j] = tmp;}}/** * 选择排序 */public static void selectionsort(int[] data) {int i, j, least;for (i = 0; i < data.length - 1; i++) {for (j = i + 1, least = i; j < data.length; j++) {if (data[j] < data[least])least = j;}swap(data, least, i);}}/** * 冒泡排序 */public static void bubblesort(int[] data) {int i, j;for (i = 0; i < data.length - 1; i++) {for (j = data.length - 1; j > i; --j)if (data[j] < data[j - 1])swap(data, j, j - 1);}}public static void swap(int[] data, int first, int second) {int tmp;tmp = data[first];data[first] = data[second];data[second] = tmp;}/** * 快速排序 */public static void QuickSort(int[] data) {QSort(data, 0, data.length - 1);}private static void QSort(int[] data, int s, int t) {int pivotLoc;if (s < t) {pivotLoc = Partition(data, s, t); // 对data[1...data.length-1]进行一次划分QSort(data, s, pivotLoc - 1); // 对低子序列进行递归排序QSort(data, pivotLoc + 1, t); // 对高子序列进行递归排序}}/** * 优化的快速排序 */public static void OptimizeQuickSort(int[] data) {OQSort(data, 0, data.length - 1);}private static void OQSort(int[] data, int s, int t) {int pivotLoc;if (s < t) {pivotLoc = RandomPartition(data, s, t);// 随机选取一个元素关键字作为枢轴进行划分QSort(data, s, pivotLoc - 1); // 对低子序列进行递归排序QSort(data, pivotLoc + 1, t); // 对高子序列进行递归排序}}private static int RandomPartition(int[] data, int low, int high) {int i = (int) Math.random() * (high - low) + low;int temp = data[low];data[low] = data[i];data[i] = temp;return Partition(data, low, high);}private static int temp;private static int Partition(int[] data, int low, int high) {int pivotKey;temp = data[low];pivotKey = data[low]; // 枢轴while (low < high) {while (low < high && data[high] >= pivotKey) {high--;}data[low] = data[high];while (low < high && data[low] <= pivotKey) {low++;}data[high] = data[low];}data[low] = temp;return low;}}答案补充java代码已经测试通过,调用各种不同的排序方法需要把main方法中的注释打开。快速排序中利用了递归你需要仔细的看一下。

原创粉丝点击