最近想探究一下算法方面的问题,闲着无聊就撸了一波快排的代码,以前都是直接拿过来用的,但是想想毕竟那是别人的东西,只有自己学会才算自己的,思路其实不难,只是需要好的处理一些细节问题,下面来说说思路和代码实现。
基本思路:
* 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);
} else
return;
}
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=right
return left;
}
private void swap(int left, int right) { //交换两个数
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
572



被折叠的 条评论
为什么被折叠?



