Java 排序(快排,归并)
Java 排序有Java.util.Arrays的sort方法,具体查看JDK API(一般都是用快排实现的,有的是用归并)
package yxy;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arrs = { 1,0,5,9 };
Arrays.sort(arrs);
for (int a : arrs) {
System.out.print(a+"\t");
}
}
}
运行结果:
0 1 5 9
但是如果我是想让从大到小排序呢,(可以逆序输出吧,一边儿呆着去,我是想让数组自己就从大到小排序)(http://luoqidunwu.iteye.com/blog/1571687)
package yxy; import java.util.Arrays;
import java.util.Comparator; class DownCompare implements Comparator<Integer> { @Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
// return o1==02?0:(o1<o2?1:-1);
if (o1.intValue() < o2) {
return 1;
} else if (o1 == o2) {
return 0;
} else {
return -1;
}
} } public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub
Integer[] arrs = { 1, 0, 5, 9 };
Arrays.sort(arrs, new DownCompare());
for (int a : arrs) {
System.out.print(a + "\t");
}
}
}
运行结果:
9 5 1 0
其实是这个方法,需要写一个类继承Comparator接口
sort(T[] a, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组进行排序。
如果说自己写快排呢
先说点儿快排稳定性的吧,快排是不稳定的,比如说 5 8(a) 8(b) 1(a) 1(b) 选5作为枢纽元素,排序后1((b) 1(a) 5 8(b) 8(a)
//参考:http://www.algolist.net/Algorithms/Sorting/Quicksort
package yxy; class QuickSort {
int partition(int arr[], int left, int right) {
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2]; // 选择中间元素作为枢元
//若改为int pivot = left; :则 java.lang.StackOverflowError while (i < j) { //若改为i<=j: 则java.lang.StackOverflowError
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) { //若改为 i<j :则java.lang.StackOverflowError
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
return i;
} void quickSort(int arr[], int left, int right) {
if (arr == null || arr.length <= 1)
return;
int index = partition(arr, left, right);
if (left < index)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
} public class Test2 { public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = { 1, 0, 5, 9 };
new QuickSort().quickSort(arr, 0, arr.length - 1);
for (int a : arr) {
System.out.print(a + "\t");
}
} }
对快排不熟悉,为什么改变代码会出现java.lang.StackOverflowError不清楚
明哥给我说的方法,很好理解(下面估计说不清,画个图看看就容易理解了),枢纽元素选择最后一个,然后2个下标指针i,s都指向开始,s的作用是指向i扫描过的第一个比枢纽元素大的位置,i扫描到比枢纽元素小的就和s位置的换,i位置比枢纽元素大的就直接i++
package yxy;
class QuickSort {
void quickSort(int arr[], int left, int right) {
if (arr == null || arr.length <= 1 || left > right) {
return;
}
int i = left, s = left, p = right, tmp; // p指向枢元的位置,i一直往下走,当遇到比arr[p]小的元素时和arr[s]交换
while (i < p) {
if (arr[i] < arr[p]) {
tmp = arr[i]; // 这三句,如果刚开始的元素都小于枢纽元素,则都是自己和自己交换,影响效率,可以判断i和s是否相等,相等就不交换了
arr[i] = arr[s];
arr[s] = tmp;
i++;
s++;
} else {
i++;
}
}
tmp = arr[s];
arr[s] = arr[p];
arr[p] = tmp;
quickSort(arr, left, s - 1);
quickSort(arr, s + 1, right);
}
}
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = { 1, 0, 5, 9 };
new QuickSort().quickSort(arr, 0, arr.length - 1);
for (int a : arr) {
System.out.print(a + "\t");
}
}
}
12、13、14和21、22、23这么写太麻烦了,写个函数吧
void swap(int a,int b){
int tmp;
tmp=a;
b=a;
a=tmp;
}
哇,不行哇,哦,java传递参数的问题,记起刚学C时经常碰到这个问题了吧
void swap(Integer a,Integer b){
Integer tmp;
tmp=a;
b=a;
a=tmp;
}
这个也不行
详情参考:http://bbs.csdn.net/topics/390245117 28楼
归并排序
Java 排序(快排,归并)的更多相关文章
- Java实现快排+小坑+partition的两种思路
在做一道剑指Offer的题的时候,有道题涉及到快排的思路,一开始就很快根据以前的思路写出了代码,但似乎有些细节不太对劲,自己拿数据试了下果然.然后折腾了下并记录下一些小坑,还有总结下划分方法parti ...
- 数据结构--排序--快排and冒泡(python)
听说大厂面试,限时两分钟写出来快排... 闲着没事,写了一下... def Partition(L,low,high): pivotkey = L[low] while low<high: wh ...
- [排序] 快排 && 冒泡(自己写)
#include <iostream> using namespace std; /* 快速排序 通过一趟排序,以轴点为界 分割为两部分:左部分 <= 轴点 <= 右部分 再分 ...
- QuickSort(快排)的JAVA实现
QuickSort的JAVA实现 这是一篇算法课程的复习笔记 用JAVA对快排又实现了一遍. 先实现的是那个easy版的,每次选的排序轴都是数组的最后一个: package com.algorithm ...
- Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...
- Java实现的各种排序算法(包括冒泡,快排等)
//堆排序 不稳定 import java.util.Arrays; public class HeapSort { public static void main(String[] args) { ...
- Java排序算法 [选择、冒泡、快排]
选择排序: 简述:从数组的第一个元素开始,依次与其他所有的元素对比,如果比自身大或小(取决于升序或降序)交换位置. package com.sort; import java.util.Arrays; ...
- 排序 之 快排、归并、插入 - <时间复杂度>----掌握思想和过程
俗话说:天下武功无坚不破,唯快不破.对于算法当然也是要使用时间最短.占用空间最小的算法来实现了. 注意:我代码里面打的备注仅供参考,建议不要背模板(因为没有固定的模板),可以写一个数列按着代码跑两圈或 ...
- Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
随机推荐
- c++多线程在异常环境下的等待
c++11开始支持多线程编程,相关的类和函数封装在标准库头文件<thread>中,而c++多线程编程很重要的一点就是当用户创建一个std::thread对象,关联了可调用对象后,需要在该t ...
- three.js入门系列之导入拓展类
先来看一下three.js包的目录结构: 我们使用的时候,可以一次性import所有的功能,也可以按需引入,全依赖three.module.js这个文件对three.js的功能作了模块化处理: 但是, ...
- poscms基于list标签实现的查询分页功能
poscms系统本身有一个在查询页(search页面)实现的查询分页功能,基于系统封装的php函数dr_search_url() 但是今天的需求除了导航栏.列表页.详情页都实现查询功能外,关键是有两个 ...
- php 配置上传大文件
打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就 ...
- ajax前置处理实现异步请求session过期时跳转登录页面
第一篇博文,mark一下zhq[0]. 问题描述:用户页面,当session过期或都session注销后,普通页面后端都会有过滤器,session过期Redirect到登录页面,但是ajax请求后端只 ...
- phpcms后台主菜单不显示
phpcms\modules\admin\templates\main.tpl.php 注释掉既可
- 并查集实现Tarjan算法
本文是对http://noalgo.info/476.html的一点理解,特别是对其中 int father[mx]: //节点的父亲 int ancestor[mx]; //已访问节点集合的祖先 这 ...
- CF1117C Magic Ship
CF1117C Magic Ship 考虑到答案具单调性(若第 \(i\) 天能到达目的点,第 \(i+1\) 天只需向风向相反的方向航行),可以二分答案. 现在要考虑给出一个天数 \(m\) ,问 ...
- hadoop 的job.setOutputKeyClass和job.setOutputValueClass的几个问题
昨天写了一个mapreduce函数一直有错误,找不到错误,今天找了一天终于解决了,原来是hadoop 的job.setOutputKeyClass和job.setOutputValueClas设置输出 ...
- 剑指offer第七章&第八章
剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...