黑马程序员技术交流社区
标题:
快速排序
[打印本页]
作者:
徐强
时间:
2012-10-29 22:00
标题:
快速排序
本帖最后由 徐强 于 2012-10-30 09:32 编辑
晚上看了下排序的几种算法,对快还排序没怎么看明白,那位大神能给我讲讲,最好能贴出一份注释祥细的java代码。{:2_41:}
作者:
古银平
时间:
2012-10-29 22:24
我给你思想,希望你能编出代码,自己写了才会记住:
快速排序顺利用递归原理,把数组无限制的分成两部分,直到所有数据都排好序为止。
分析:快速排序的基本思想是通过一趟排序将要排序的数据分割成两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后按此方法对这两部分数据分别
进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤:
如果要排序的数组是A[0].........A[N-1],首先任意选取一个数据(通常选用第一个数据)作为中间数据,然后将所有比他小的数都放到它前面,所有比他大的数据都放到它
后面,这个过程称为一趟快速排序。一趟快速排序的算法如下:
(1)设置两个变量i,j,排序开始的时候:i=1,j=N-1.
(2)以第一个数组元素作为中间数据,赋值给pivot,即pivot=A[0]。
(3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于X的值。
(4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于X的值,并与上一步找到的数字交换。
(5)重复3,4步,直到i>=j。
(6)然后把j所在的数字与pivot交换。
(7)最后把j以前的数组和j到最后的数组,在进行递归的快速排序。
作者:
付维翔
时间:
2012-10-29 23:17
public class QuicSort {
/**
* 一趟快速排序的方法
*
* @param array
* 所要排序的数组
* @param h
* 排序子列的开始位置
* @param p
* 排序子列的结束位置
* @return 返回当前一趟快速排序后,比较关键字所处于的位置
*/
private static int quickPass(int[] array, int h, int p) {
int i = h;
int j = p;
int x = array[i];// 比较所用的关键字
while (i < j) {
while ((array[j] >= x) && (i < j))
// 自尾端进行比较
j--;
if (i < j) {
array[i] = array[j];// 将小于关键字的记录移至i所指的位置,完成第一次交换
i++;
// 自首端进行比较
while ((array[i] <= x) && (i < j)) {
i++;
if (i < j) {
array[j] = array[i];// 将大于关键字的记录移到j所指的位置
j--;
}
}
}
}
array[i] = x;// 一趟快速排序完成,将x移至正确位置
return i;
}
/**
* 对一个数组的部分进行排序,
*
* @param array
* 排序的数组
* @param s
* 排序开始的位置
* @param t
* 所要排序结束的位置
*/
public static void quickSort(int[] array, int s, int t) {
int i = 0;
if (s < t) {// 未做数组越界检查的代码
i = quickPass(array, s, t);
quickSort(array, s, i - 1);
quickSort(array, i + 1, t);
}
}
/**
* 对一个数组进行快速排序
*
* @param array
* 排序的数组
*/
public static void quickSort(int[] array) {
int s = 0;
int t = array.length - 1;
int i = 0;
if (s < t) {
i = quickPass(array, s, t);
quickSort(array, s, i - 1);
quickSort(array, i + 1, t);
}
}
/**
* 输出排好序的数组
*
* @param array
*/
private static void printArray(int[] array) {
System.out.print("排过序的数组:");
for (int a : array) {
System.out.print(a + " ");
}
System.out.println("");
}
public static void main(String[] args) {
int[] array1 = { 4, 1, 6, 3, 2, 9, 7 };
quickSort(array1);// 此方法对一个数组使用快速排序法做升序排序
System.out.println("对整个数组排序");
printArray(array1);
int[] array2 = { 4, 1, 6, 3, 2, 9, 7 };
// 此方法,提供了对数组部分元素的进行排序的功能,比如,只排序数组中的前五位:
quickSort(array2, 0, 4);
System.out.println("仅对数组中前五位元素进行排序");
printArray(array2);
}
}
复制代码
作者:
徐强
时间:
2012-10-30 10:48
受教了,自己学着写了一个出来看看。
public class Sort {
/**
* 快速排序
*/
public static void main(String[] args) {
int arr[] = {4,12,5,1,97,16,3,7};
quickSort(arr,0,arr.length-1);
printArr(arr);
}
//用递归让整个数组序列化
private static void quickSort(int[] arr, int begin, int end) {
if(begin>end){
return ;
}
int i = onceSort(arr,begin,end);
quickSort(arr,begin,i-1);
quickSort(arr,i+1,end);
}
//打印数组
private static void printArr(int[] arr) {
for(int i : arr){
System.out.print(i+"\t");
}
}
//一趟快速排序,并返回用于下次分组的中间值i
public static int onceSort(int[]arr,int begin,int end){
int i = begin;
int j = end;
int key = arr[i];
while(j>i){
while(arr[j]>key&&j>i){
j--;
}
if(j>i){
arr[i] = arr[j];
arr[j] = key;
}
while(arr[i]<key&&j>i){
i++;
}
if(j>i){
arr[j] = arr[i];
arr[i] = key;
}
}
return i;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2