快速排序Java实现
来源:互联网 发布:淘宝代销不是长久之计 编辑:程序博客网 时间:2024/04/28 01:33
假设有n个记录,键值为k1,k2,...kn。利用分治策略与递归思想解决快速排序:
1.取i为第一个键值。
2.从左至右查找ki使得ki>k。
3.从右至左查找kj使得kj<k。
4.若i<j,swap(ki,kj),继续步骤2。
5.若i>j,swap(k,kj),并以j为基点分割为左右两部分,递归左右两部分进行排序(不包括j位置的键值)。
以下为代码实现,有不足的地方烦请指正,感谢!
import java.util.Arrays;public class QuickSorting {public static void sort(int[] data, int low, int high) {int i = 0, j = 0, index = 0;int temp = 0;if (low > high)return;i = low;j = high;index = data[i];while (i < j) {while (i < high && data[i] <= index)i++;while (j > low && data[j] >= index)j--;if (i < j) {temp = data[i];data[i] = data[j];data[j] = temp;} else {temp = data[j];data[j] = index;data[low] = temp;sort(data, low, j - 1);sort(data, j + 1, high);}}}public static void quickSort(int[] data) {sort(data, 0, data.length - 1);}public static void main(String[] args) {int data[] = { 10,12,3,54,5,11,7,1 };quickSort(data);System.out.println(Arrays.toString(data));}}
平均时间复杂度为O(nlogn),最坏O(n^2),最佳O(nlogn)。
平均空间复杂度为O(nlogn),最坏O(n),最佳O(logn)。
对主元改进后的算法如下,除了待排序数组全为相等元素时复杂度最差,其他情况皆为O(nlogn),还可以改进,改进的思路就是把pivot的位置放到数组末尾,在检测时当遇到与pivot相等时停止检测,等待交换,要想设计出一个完美的算法真的是一件头疼的事情。
package Sorting;//改进后的import java.util.Arrays;public class Quick_Sort {private static int midOf_3(int[] data, int low, int high) {int mid = (low + high) / 2;if (data[low] > data[mid])swap(data, low, mid);if (data[low] > data[high])swap(data, low, high);if(data[mid] > data[high])swap(data, mid, high);swap(data, low, mid);return data[low];}private static void swap(int[] data, int i, int j) {int temp = 0;temp = data[i];data[i] = data[j];data[j] = temp;}private static void sort(int[] data, int low, int high) {int i = low;int j = high;int pivot = 0;if (low >= high)return;pivot = midOf_3(data, low, high);while (i < j) {while (i < high && data[i] <= pivot)i++;while (j > low && data[j] >= pivot)j--;if (i < j)swap(data, i, j);else {swap(data, low, j);sort(data, low, j - 1);sort(data, j + 1, high);}}}private static void quick_sort(int[] data) {sort(data, 0, data.length - 1);}public static void main(String[] args) {int[] data = { 8, 1, 4, 9, 7, 6};quick_sort(data);System.out.println(Arrays.toString(data));}}
阅读全文
1 0
- java实现快速排序
- 快速排序Java实现
- 快速排序java实现
- 快速排序JAVA实现
- Java实现快速排序
- 快速排序--Java实现
- 快速排序java实现
- java实现快速排序
- java实现快速排序
- Java实现快速排序
- Java实现快速排序
- 快速排序java实现
- 快速排序Java实现
- Java实现快速排序
- java快速排序实现
- JAVA实现快速排序
- java实现快速排序
- java 实现快速排序
- Xcode8.1 bundle format unrecognized, invalid, or unsuitable
- linux常用小技巧
- 成功集成个推后,点击推送直接跳入app指定页面
- 初步认识restful接口
- 使用websocket和highcharts实现动态图标展示
- 快速排序Java实现
- 修改CSpreadSheet commit函数,让其插入新行时不再重复删除 创建 写数据
- 继承 多态 接口 抽象类 内部类
- 【真题】京东2017校招编程题 进制均值
- Java常用类——Date类、SimpleDateFormate类
- bootstarup栅格系统
- java递归-小鸡吃米问题
- 【Android前端】Bing每日图片列表应用制作记录——1.从零开始
- 向值栈放数据