学习笔记之快速排序——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;
}
快速排序的思想就是:
找到第一个元素应该在的位置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;
}
相关文章推荐
- 8大内部排序算法学习笔记--(2)快速排序 Java实现
- 黑马程序员—Java基础学习笔记之排序算法:选择排序&冒泡排序
- 基础算法学习笔记—快速排序
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
- JAVA基础day04 数组学习 排序和查找基本算法
- 算法学习笔记--排序之快速排序
- java基础算法之快速排序
- 算法(第四版)学习笔记之java实现选择排序
- 8大内部排序算法学习笔记--(4)归并、基数排序 Java实现
- 数据结构&算法学习笔记: 快速排序
- 黑马程序员_java基础学习笔记之排序算法(选择排序、冒泡排序
- 算法第四版学习笔记之快速排序 QuickSort
- 【Java学习笔记】基础知识学习5【数组排序,复制】
- Java基础学习笔记 -- 10(数组排序)
- 【幻化万千戏红尘】qianfengDay11-java基础学习:数组,排序,算法
- 学习笔记:快速排序的C++、JavaScript(2种方法)、Java实现
- 8大内部排序算法学习笔记--(3)选择排序java实现
- JAVA学习笔记:基础算法(附Java与C之间检查数组越界的差异)
- 算法学习笔记之快速排序
- 学习笔记----快速排序的java实现及其改良