永发信息网

那位大大能详细的讲解一下JAVA中的快速排序

答案:2  悬赏:0  手机版
解决时间 2021-05-14 15:10
那位大大能详细的讲解一下JAVA中的快速排序
最佳答案

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n)。

另外 java没指针概念 可以认为是句柄
假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一趟快速排序的算法是:

1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;

2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5)、重复第3、4步,直到I=J;

例如:待排序的数组A的值分别是:(初始关键数据X:=49)

A[1] A[2] A[3] A[4] A[5] A[6] A[7]:

49 38 65 97 76 13 27

进行第一次交换后: 27 38 65 97 76 13 49

( 按照算法的第三步从后面开始找)

进行第二次交换后: 27 38 49 97 76 13 65

( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )

进行第三次交换后: 27 38 13 97 76 49 65

( 按照算法的第五步将又一次执行算法的第三步从后开始找)

进行第四次交换后: 27 38 13 49 76 97 65

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )

此时再执行第三步的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

初始状态 {49 38 65 97 76 13 27}

进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}

分别对前后两部分进行快速排序 {13} 27 {38}

结束 结束 {49 65} 76 {97}

49 {65} 结束

结束




//下面是一个示例,哪位给说说快速排序法的原理,下面的示例中指针和上下标移动我看不太懂,
public class QuickSort {

public static void main(String[] args) {
//声明数组
int[] nums = {27, 8, 57, 9, 23, 41, 65, 19, 0, 1, 2, 4, 5};
//应用快速排序方法
quickSort(nums, 0, nums.length-1);
//显示排序后的数组
for(int i = 0; i < nums.length; ++i) {
System.out.print(nums[i] + ",");
}
System.out.println("");
}


public static void quickSort(int[] a, int lo0, int hi0) {
int lo = lo0;
int hi = hi0;

if (lo >= hi)
return;

//确定指针方向的逻辑变量
boolean transfer=true;

while (lo != hi) {
if (a[lo] > a[hi]) {
//交换数字
int temp = a[lo];
a[lo] = a[hi];
a[hi] = temp;
//决定下标移动,还是上标移动
transfer = (transfer == true) ? false : true;
}

//将指针向前或者向后移动
if(transfer)
hi--;
else
lo++;

//显示每一次指针移动的数组数字的变化

}

//将数组分开两半,确定每个数字的正确位置
lo--;
hi++;
quickSort(a, lo0, lo);
quickSort(a, hi, hi0);
}
}

全部回答

看看这些 或许对你有帮助 都是我平常需要的时候写下来的 希望可以采纳。

0.排序基类 package com.javasort; public abstract class Sorter<E extends Comparable<E>> { public abstract void sort(E[] array, int from, int len); public final void sort(E[] array) { sort(array, 0, array.length); } protected final void swap(E[] array, int from, int to) { E tmp = array[from]; array[from] = array[to]; array[to] = tmp; } public final void printResult(E[] array){ for(int i=0;i<array.length;i++){ System.out.print(array[i]+","); } } } 1.冒泡排序 package com.javasort.bubblesorter; import com.javasort.Sorter; public class BubbleSorter<E extends Comparable<E>> extends Sorter<E> { private static boolean DOWN = true; @Override public void sort(E[] array, int from, int len) { if (DOWN) { bubble_down(array, from, len); } else { bubble_up(array, from, len); } } private final void bubble_down(E[] array, int from, int len) { for(int i=from;i<from+len;i++){ for(int j=from+len-1;j>i;j--){ if(array[j].compareTo(array[j-1])<0){ swap(array, j-1, j); } } } } private final void bubble_up(E[] array, int from, int len) { for(int i=from+len-1;i>=from;i--){ for(int j=from;j<i;j++){ if(array[j].compareTo(array[j+1])>0){ swap(array, j, j+1); } } } } static final void up() { DOWN=false; } } package com.javasort.bubblesorter; import com.javasort.Sorter; public class BubbleSorterTest { public static void main(String[] args) { Comparable[] array={5,1,13,2,17,9,7,4,0}; Sorter bubbleSorter=new BubbleSorter(); //BubbleSorter.up(); bubbleSorter.sort(array); bubbleSorter.printResult(array); } } 2.插入法排序 package com.javasort.insertsorter; import com.javasort.Sorter; public class InsertSorter<E extends Comparable<E>> extends Sorter<E> { @Override public void sort(E[] array, int from, int len) { E temp=null; for(int i=from+1;i<from+len;i++){ temp=array[i]; int j=i; for(;j>from;j--){ if(temp.compareTo(array[j-1])<0){ array[j]=array[j-1]; } else break; } array[j]=temp; } } } package com.javasort.insertsorter; import com.javasort.Sorter; public class InsertSorterTest { public static void main(String[] args) { Comparable[] array={5,1,13,2,14,9,7,4,0}; Sorter insertSort=new InsertSorter(); insertSort.sort(array); insertSort.printResult(array); } } 3.快速排序 package com.javasort.quicksorter; import com.javasort.Sorter; public class QuickSorter<E extends Comparable<E>> extends Sorter<E> { @Override public void sort(E[] array, int from, int len) { q_sort(array, from, from + len - 1); } private final void q_sort(E[] array, int from, int to) { if (to - from < 1) return; int pivot = selectPivot(array, from, to); pivot = partion(array, from, to, pivot); q_sort(array, from, pivot - 1); q_sort(array, pivot + 1, to); } private int partion(E[] array, int from, int to, int pivot) { E tmp = array[pivot]; array[pivot] = array[to];// now to's position is available while (from != to) { while (from < to && array[from].compareTo(tmp) <= 0) from++; if (from < to) { array[to] = array[from];// now from's position is available to--; } while (from < to && array[to].compareTo(tmp) >= 0) to--; if (from < to) { array[from] = array[to];// now to's position is available now from++; } } array[from] = tmp; return from; } private int selectPivot(E[] array, int from, int to) { return (from + to) / 2; } } package com.javasort.quicksorter; import com.javasort.Sorter; import com.javasort.insertsorter.InsertSorter; public class QuickSorterTest { public static void main(String[] args) { Comparable[] array={5,1,13,2,14,9,7,4,0}; Sorter quickSorter=new QuickSorter(); quickSorter.sort(array); quickSorter.printResult(array); } } 4.选择排序 package com.javasort.selectsorter; import com.javasort.Sorter; public class SelectSorter<E extends Comparable<E>> extends Sorter<E> { @Override public void sort(E[] array, int from, int len) { for (int i = 0; i < len; i++) { int smallest = i; int j = i + from; for (; j < from + len; j++) { if (array[j].compareTo(array[smallest]) < 0) { smallest = j; } } swap(array, i, smallest); } } } package com.javasort.selectsorter; import com.javasort.Sorter; import com.javasort.bubblesorter.BubbleSorter; public class SelectSorterTest { public static void main(String[] args) { Comparable[] array={5,1,13,2,17,9,7,4,0}; Sorter selectSorter=new SelectSorter(); selectSorter.sort(array); selectSorter.printResult(array); } }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
十字绣的线??急!!
砥砺奋进的意思,砥砺奋进是什么意思
宛城区海贝儿游乐场在哪里啊,我有事要去这里
怎样才能让情侣之间有聊不完的话题?
70套装有什么属性比较好啊!
彩虹qq 显ip显隐身 2.71怎么查IP
一年级黑板标语,一年级里陈学冬管学生们用的
关于美人心计和未央沉浮
新洲区武汉市新澳向日葵艺术幼儿园怎么去啊,
最近有什么好玩的呀!郁闷死了?
女孩左肩有痣代表什么,传说女人眉头上有痣,
雪佛兰科鲁兹和本田锋范那个车比较好?请说下
怎么样可以使情侣之间关系更好?
安化县时尚元素(建设路)在什么地方啊,我要过
描写大明湖风景的句子
推荐资讯
我姓谢生了一个女儿,想起个名字 她的八字是阳
动感地带如何开通10元300M的GPRS套餐?
高一的孩子用什么办法可以常时间学习还不困不
石鼓区国大药房(西湖公园店)在哪里啊,我有事
孝南区京东(孝感东城站)这个地址在什么地方,
到底和他之间还少了点什么?
北京到印度飞机多久,从北京到印度德里的航班
老河口市申通快递地址有谁知道?有点事想过去
浚县振西面馆(云溪路)我想知道这个在什么地方
艾的五笔怎么打字,元字五笔怎么打字
宁远县天津狗不理汤包地址在什么地方,想今天
涟源市美涂士艺术漆地址是什么,有没有知道的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?