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排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
随机推荐
- 369C Valera and Elections
http://codeforces.com/problemset/problem/369/C 树的遍历,dfs搜一下,从根节点搜到每个分叉末尾,记录一下路况,如果有需要修复的,就把分叉末尾的节点加入答 ...
- 初用vue遇到的一些问题
1.过滤器: filters: { search(list) { es5 var _self = this; //return list.filter(menu => menu.childs.n ...
- apt-get -f install
http://zhidao.baidu.com/link?url=tZLEfm1Ycc1pWS67-95fXU596CtwA_1l2pPfzINUTxvOCvWdf3JZsWuZNxsxn0Jv6Om ...
- 【剑指offer】09-3变态跳台阶
原创博文,转载请注明出处! # 本文是牛客网<剑指offer>刷题笔记,笔记索引连接 1.题目 # 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的 ...
- python文件写中的f.flush()方法
f = open("input.txt", "w") f.write("aaaaaa") f.flush() #强行把缓冲区中的内容放到磁盘 ...
- bytes 与 str的区别以及装换
bytes 和 str 的区别: bytes 存储字节( 通常值在 range(0, 256)) str 存储unicode字符( 通常值在0~65535) bytes 与 str 的转换 编码(en ...
- C/C++比较容易搞混的一些写法
#include <stdio.h> int main() { int a = 101; char ch = *(char *)&a; //*(char *)&a:含义就是 ...
- web安全知识
参考文章 : https://www.mudoom.com/php%E5%AE%89%E5%85%A8%E7%BC%96%E7%A0%81/ SQL注入 造成sql注入的原因是因为程序没有过滤用户输 ...
- [BZOJ5329][SDOI2018]战略游戏
bzoj luogu Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任 ...
- Cassandra spring data 试用
1. maven 依赖 <dependency> <groupId>org.springframework.data</groupId> <artifact ...