Java使用分治递归的思想实现快速排序

来源:互联网 发布:网络剧小视频 编辑:程序博客网 时间:2024/05/16 08:37

最近想探究一下算法方面的问题,闲着无聊就撸了一波快排的代码,以前都是直接拿过来用的,但是想想毕竟那是别人的东西,只有自己学会才算自己的,思路其实不难,只是需要好的处理一些细节问题,下面来说说思路和代码实现。

基本思路:

 * 1、定义一个函数找出基准值temp。

 *    (1)找基准的函数中:定义一个头指针,尾指针,头指针指向数组的第一个元素,尾指针指向数组的最后一个元素。
 *    (2)在头指针指向的位置小于尾指针的情况下: 尾指针对数组从右至左找小于temp值的位置,然后将该位置上的元素值与头指针指定的位置上的元素值进行交换。
 *    (3)在头指针指向的位置小于尾指针的情况下: 头指针对数组从左至右找大于temp值的位置,然后将改位置上的元素值与尾指针指定的位置上的元素值进行交换。
 *    (4)循环执行(1)(2)直到头指针指向的位置等于尾指针指向的位置时,返回头指针指向的位置(也就是基准的位置值)。
 * 2、利用分治思想,将原问题划分成多个子问题,也就是通过基准将数组一分为二,再对数组arr[0 ~ temp-1]和数组arr[temp+1 ~ arr.lengh-1]进行排序。
 * 3、利用递归的思想,排序时也按照步骤1执行,然后继续划分,继续排序,一直递归,直到只有一个元素为止。
 *          PS:(程序中递归传入的参数是要排列数值的第一个值left和最后一个值right,所以当数组中只有一个元素的时候,即left=right)
 *
 * 实例说明:数组的初始序列为 :4 3 5 7 2 9 4 1 3 8 11
 *               执行从右至左查找后:3 3 5 7 2 9 4 1 4 8 11
 *               执行从左至右查找后:3 3 4 7 2 9 4 1 5 8 11

 *                       执行一趟排序后:3 3 1 2 4 9 4 7 5 8 11

package com.meession.quicksort;public class QuickSort {private int[] arr = { 4, 3, 5, 7, 2, 9, 4, 1, 3, 8, 11 };public static void main(String[] args) {QuickSort qs = new QuickSort();qs.init(); //初始化qs.showArr(); //打印已经排列好的数组}private void init() { //初始化int left = 0;int right = arr.length;QSort(left, right); //调用递归函数进行排序}private void QSort(int left, int right) { //递归进行排序if (left < right) {int temp = findSign(left, right); //找出基准位置QSort(left, temp); // 递归QSort(temp + 1, right);} elsereturn;}private void showArr() { //输出数组中的元素int i = 0;while (i < arr.length)System.out.print(arr[i++] + " ");System.out.println();}private int findSign(int left, int right) {  //找出基准位置函数int temp = arr[left];while (left < right) {while (left < right) {if (temp > arr[--right]) { // --i表示先执行一次减,所以此处初始值为arr[right-1]swap(left, right);break;}}while (left < right) {if (temp < arr[++left]) {swap(left, right);break;}}} // while循环结束的条件就是left=rightreturn left;}private void swap(int left, int right) { //交换两个数int temp = arr[left];arr[left] = arr[right];arr[right] = temp;}}


0 0
原创粉丝点击