快速排序
2015-10-10 16:12
429 查看
edit version : 2017-3-5
最近在全面阅读排序算法,对之前的快速排序博文做下补充优化。
由于是借鉴csdn,cnblogs等多个博文,在此注明转载,不一一列举。
//quick sort
//交换子表的记录,使枢轴记录到位,并返回枢轴所在的位置
private static int Partition(int array[], int low, int high){
/*三数中值分割法*/
int m = low + (high - low) / 2;//数组中间元素的下标
if (array[low]>array[high]) //保证左端较小
swap(array, low, high);
if (array[m] > array[high]) //保证中间较小
swap(array, high, m);
if (array[m] > array[low])
swap(array, m, low); //保证左端最小
//此时array[low]已经为整个序列左中右三个关键字的中间值
int pivotkey = array[low];
/*固定基准元
int pivotkey = array[low];
*/
/*随机基准元
int randomIndex = rand() % (high - low) + low;//取数组中随机下标
swap(array, randomIndex, low); //与第一个数交换
int pivotkey = array[low];
*/
int i = low, j = high;
while(i<j) //从表的两端交替向中间扫描,当没有相遇
{
while (array[j] >= pivotkey&&i<j){
j--;
}
while (array[i] <= pivotkey&&i<j){
i++;
}
if (i<j)
{
swap(array, i, j);
}
}
//最终将基准数归位
swap(array, low, i);
return i; //返回枢轴所在的位置
}
private static void qSort(int array[], int low, int high){
int pivot;
if (low<high)
{
pivot = Partition(array, low, high);//算出枢轴值
qSort(array, low, pivot - 1); //对低子表递归排序
qSort(array, pivot + 1, high); //对高子表递归排序
}
}
//对array做快速排序
public static int[] quickSort(int array[]){
qSort(array, 0, array.length-1);
return array;
}
最近在全面阅读排序算法,对之前的快速排序博文做下补充优化。
由于是借鉴csdn,cnblogs等多个博文,在此注明转载,不一一列举。
//quick sort
//交换子表的记录,使枢轴记录到位,并返回枢轴所在的位置
private static int Partition(int array[], int low, int high){
/*三数中值分割法*/
int m = low + (high - low) / 2;//数组中间元素的下标
if (array[low]>array[high]) //保证左端较小
swap(array, low, high);
if (array[m] > array[high]) //保证中间较小
swap(array, high, m);
if (array[m] > array[low])
swap(array, m, low); //保证左端最小
//此时array[low]已经为整个序列左中右三个关键字的中间值
int pivotkey = array[low];
/*固定基准元
int pivotkey = array[low];
*/
/*随机基准元
int randomIndex = rand() % (high - low) + low;//取数组中随机下标
swap(array, randomIndex, low); //与第一个数交换
int pivotkey = array[low];
*/
int i = low, j = high;
while(i<j) //从表的两端交替向中间扫描,当没有相遇
{
while (array[j] >= pivotkey&&i<j){
j--;
}
while (array[i] <= pivotkey&&i<j){
i++;
}
if (i<j)
{
swap(array, i, j);
}
}
//最终将基准数归位
swap(array, low, i);
return i; //返回枢轴所在的位置
}
private static void qSort(int array[], int low, int high){
int pivot;
if (low<high)
{
pivot = Partition(array, low, high);//算出枢轴值
qSort(array, low, pivot - 1); //对低子表递归排序
qSort(array, pivot + 1, high); //对高子表递归排序
}
}
//对array做快速排序
public static int[] quickSort(int array[]){
qSort(array, 0, array.length-1);
return array;
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统