快速排序
来源:互联网 发布:eviews时间序列数据 编辑:程序博客网 时间:2024/06/16 22:13
1、排序原理
1)先从要排序的数组中取出一个基数(可以先把第一个数作为基数)然后用后面的数依次和基数比较,如果比基数大就放到基数的右边,反之放到左边;
2)把数组从这个基数所在的位置分成两个数组,左边一个,右边一个,把这两个数组分别按照第一步的方法进行排序;
3)一直不断的选出中间数,把数组不断的分成两部分直到只剩一个元素为止。
2、执行代码
a)赋值的方法
1) 先从数组的最高下标所对应的数和基数比较如果这个数大,就下标向左移动继续比较,如果这个数小就把这个数赋值给下标为0所对应的;
2)然后从低下标开始向上和基数比较,如果基数大,则下标向右移继续比较如果基数小,就把这个数赋值给刚才高下标多移动到的下标所对应的数,然后高下标继续左移比较;
3)就这样循环执行,直到低下标和高下标都指向通一个位置的时候结束;
4)然后把基数赋值给高下标,此时的高下标就是中间的下标,从此位置把数组分成两个部分继续这样的比较;
5) 通过不断的分割比较直到每一个部分的长度都为1 的时候结束;此时的结果就是排完序后的结果。
package sort;import java.util.Arrays;public class QuickSortTest { public static void main(String[] args) { int a[] = { 34, 432, 43, 32, 433, 123, 543, 1, 322, 341, 134, 30, 241, 53, 41, 4124, 35 }; if (a.length > 0) { quickSort(a, 0, a.length - 1); } System.out.println(Arrays.toString(a)); } /* * 求出基数所在的下标 */ public static int findMiddle(int[] a, int low, int high) { int temp = a[low]; while (low < high) { while (low < high && a[high] > temp) { high--; } a[low] = a[high]; while (low < high && a[low] < temp) { low++; } a[high] = a[low]; } a[high] = temp; return high; } /* * 用递归进行排序运算 */ public static void quickSort(int[] a, int low, int high) { if (low < high) { int middle = findMiddle(a, low, high); quickSort(a, 0, middle - 1); quickSort(a, middle + 1, high); } }}
结果:
[1, 30, 32, 34, 35, 41, 43, 53, 123, 134, 241, 322, 341, 432, 433, 543, 4124]
b)交换位置的方法
1)先用高下标所对应的值和低下标所对应的值比较如果高下标对应的值大,就把高下标向左移动继续比较,反之就把高下标和低下标所对应的值交换位置;
2)然后用低下标所对应的值和高下标所对应的值比较如果低下标对应的值小,就把低下标向右移动继续比较,反之就把低下标和高下标所对应的值交换位置;
3)循环执行前两个步骤,直到高下标和低下标都指向同一个位置的时候结束;
4)此时高下标(低下标)所表示的下标就是中间值,从此位置把数组分成两个部分继续上面的比较;
5)通过不断的分割比较直到每一个部分的长度都为1 的时候结束;此时的结果就是排完序后的结果。
package sort;import java.util.Arrays;public class QuickSortTest { public static void main(String[] args) { int a[] = { 34, 432, 43, 32, 433, 123, 543, 1, 322, 341, 134, 30, 241, 53, 41, 4124, 35 }; if (a.length > 0) { quickSort(a, 0, a.length - 1); } System.out.println(Arrays.toString(a)); } /* * 求出基数所在的下标 */ public static int findMiddle(int[] a, int low, int high) { while (low < high) { while (a[high] > a[low]) { high--; } if (low < high) { a[high] ^= a[low]; a[low] ^= a[high]; a[high] ^= a[low]; } while (a[low] < a[high]) { low ++; } if (low < high) { a[low] ^= a[high]; a[high] ^= a[low]; a[low] ^= a[high]; } } return high; } /* * 用递归进行排序运算 */ public static void quickSort(int[] a, int low, int high) { if (low < high) { int middle = findMiddle(a, low, high); quickSort(a, 0, middle - 1); quickSort(a, middle + 1, high); } }}
结果:
[1, 30, 32, 34, 35, 41, 43, 53, 123, 134, 241, 322, 341, 432, 433, 543, 4124]
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- HDU2048
- 易语言保存,另存为代码
- 每隔几行读取文件
- 邻接矩阵图的创建
- emWin实现BMP位图皮肤之Button篇
- 快速排序
- XMG 触摸事件的处理过程
- C经典 const与指针解析
- Error retrieving parent for item: 安卓新建版本问题
- ESP8266 ESP-01 调试全过程 – 使用指导
- 【Android】图像变换
- Android 中的UI第一篇:Common Layout
- 二叉树的线索化
- 易语言