您的位置:首页 > 产品设计 > UI/UE

学习笔记之快速排序——quicklySort——基础算法——java

2017-07-06 15:29 537 查看
本来在本科学的数据结构特别水,老师和同学们还总是妖魔化快速排序这个算法,,,导致在心里觉得它是一个大boss。。。结果自己动手之后,发现快速排序极其简单,只要熟练他的思想,就不怕写不出来。。

快速排序的思想就是:

    找到第一个元素应该在的位置middle,通过左右来回比较,然后以此为分界,让左边的数组重复这一步骤,右边的数组重复这一步骤,利用递归的思想,将一个大数组拆分成无数个小数组,在遇到标记跳出点——数组长度小于等于1的这个跳出点的时候,将这个操作弹栈。

    比较的详细顺序就是,先记录最左边的数值 temp,用这个数值与右边的数字比较,正常应该是比右边的小的,然后以此让右边的角标做 -- 的操作,当发现一个temp比它还大的数字,把这个数字记录在左边,然后从左边开始比较,正常应该左边的数字都比temp要小,发现大的数字了,就用右边角标记录的位置将这个数字记录下来,最后当左右角标相等的时候,把temp的值赋给左角标指向的位置,一次比较就完成了,并且获得了这个middle应该存在的位置。

    之后用迭代的思想,把middle左边的数组排序一遍,右边的排序一遍。。。。还是比较简单易懂的。。。如果你没懂,那可能是我讲的不明白,直接看代码应该就会懂了。

   涉及到的数据结构就是三个指针,第一个指针记录这个哨兵的值,另外两个指针分别记录 left 与 right的位置。

   详细代码如下:

public void quicklySort(int[] a){

if(a.length<=1){

return;

}

quicklySort(a, 0, a.length-1);

private void quicklySort(int[] a, int left, int right){

if(left<right){

int middle = getMiddle(a, left, right);

quicklySort(a, left, middle);

quicklySort(a, middle+1, right);

}

}

private int getMiddle(int[] a, int left, int right){

int temp = a[left];

while(left<right){

while(temp<a[right]&&left<right){

right--;

}

a[left] = a[right];

while(temp>a[left]&&left<right){

left++;

}

a[right] = a[left];

}

a[left] = temp;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: