JAVA实现各种排序代码图
- 格式:pdf
- 大小:640.24 KB
- 文档页数:21
java倒序排序方法java语言是一种面向对象的编程语言,具有强大的排序功能。
在java中,倒序排序是非常常见的操作,有多种实现方法。
一、使用Collections.reverseOrder()方法java中的Collections类提供了reverseOrder()方法,可以用于倒序排序,该方法返回一个比较器,可以将一个对象列表按照指定的顺序进行排序。
示例代码如下所示:```javaimport java.util.ArrayList;import java.util.Collections;import java.util.List;public class ReverseSortExample {public static void main(String[] args) {List<Integer> numbers = new ArrayList<>();numbers.add(5);numbers.add(2);numbers.add(9);numbers.add(1);numbers.add(7);System.out.println("排序前:" + numbers); Collections.sort(numbers, Collections.reverseOrder()); System.out.println("排序后:" + numbers);}}```输出结果如下所示:```排序前:[5, 2, 9, 1, 7]排序后:[9, 7, 5, 2, 1]```在这个示例中,我们创建了一个包含一些整数的列表,并使用Collections类的sort()方法对其进行排序。
通过传递`Collections.reverseOrder()`作为比较器参数,可以实现倒序排序。
值得注意的是,reverseOrder()方法返回的是一个比较器,它会根据元素的自然顺序进行排序。
java中的按字典排序方法在Java中,可以使用不同的方法对字符串进行字典排序。
下面将介绍几种用于字典排序的常见方法。
1. 字符串数组排序如果有一个字符串数组需要进行字典排序,可以使用Arrays类中的sort()方法进行排序。
这个方法使用的是快速排序算法,可以对字符串数组按字典顺序进行排序。
例如:javaimport java.util.Arrays;public class DictionarySort {public static void main(String[] args) {String[] words = {"java", "c++", "python", "ruby"};字典排序Arrays.sort(words);输出排序结果for (String word : words) {System.out.println(word);}}}输出结果为:c++javapythonruby2. 字符串列表排序如果有一个字符串列表需要进行字典排序,也可以使用Collections类中的sort()方法进行排序。
这个方法使用的是归并排序算法,可以对字符串列表按字典顺序进行排序。
例如:javaimport java.util.ArrayList;import java.util.Collections;public class DictionarySort {public static void main(String[] args) {ArrayList<String> words = new ArrayList<>();words.add("java");words.add("c++");words.add("python");words.add("ruby");字典排序Collections.sort(words);输出排序结果for (String word : words) {System.out.println(word);}}}输出结果为:c++javapythonruby3. 自定义比较器排序如果想要根据自定义规则进行字典排序,可以实现Comparator接口并重写compare()方法。
拓扑排序java代码实现拓扑排序是一个常用于有向无环图(DAG)的算法,它按照线性顺序列出图中所有的顶点。
下面是一个简单的拓扑排序的Java实现:```javaimport java.util.*;class Graph {int V; // 顶点的数量LinkedList<Integer> adj[]; // 邻接表// 构造函数Graph(int v) {V = v;adj = new LinkedList[v];for (int i=0; i<v; ++i)adj[i] = new LinkedList();}// 添加边v-wvoid addEdge(int v, int w) {adj[v].add(w); // 将w添加到v的列表中}// 拓扑排序的实现void topologicalSortUtil(int v, boolean visited[], Stack<Integer> stack) {// 标记当前节点为已访问visited[v] = true;Integer i;Iterator<Integer> it = adj[v].iterator();while (it.hasNext()) {i = it.next();if (!visited[i])topologicalSortUtil(i, visited, stack);}// 当前节点的所有邻接节点都已被访问,将其压入栈中stack.push(new Integer(v));}void topologicalSort() {Stack<Integer> stack = new Stack<Integer>();// 标记所有顶点为未访问boolean visited[] = new boolean[V];for (int i = 0; i < V; i++)visited[i] = false;// 对每一个未访问的顶点调用topologicalSortUtil()方法for (int i = 0; i < V; i++) {if (visited[i] == false) {topologicalSortUtil(i, visited, stack);}拓扑排序通常用于有向无环图(DAG, Directed Acyclic Graph),主要用于确定事物发生的顺序或者进行任务调度。
java快速排序简单代码快速排序是一种非常高效的排序算法,它利用了分治的思想,可以在O(n log n)的时间复杂度内完成排序,比其他排序算法的速度要快得多。
在Java中,快速排序的实现并不复杂,下面就来详细介绍。
1. 选取基准点快速排序的第一步是选取基准点,在我们的代码中,我们选取数组的第一个元素为基准点,可以根据需要进行修改。
2. 分区接下来,我们需要将数组中的元素按照基准点进行分区,将比基准点小的元素放置到基准点的左边,比基准点大的元素放置到基准点的右边。
我们可以用两个指针 i 和 j 分别从左边和右边扫描数组,比较大小并交换元素,直到 i >= j。
3. 递归排序分区完成后,我们需要对左右两个分区再次进行快速排序。
我们可以使用递归的方式来实现这一过程,对左分区和右分区分别调用快速排序函数,直到所有分区都变得有序。
下面是快速排序的Java实现代码:public static void quickSort(int[] arr, int left, int right) {if (left >= right) {return;}int pivot = arr[left];int i = left, j = right;while (i < j) {while (i < j && arr[j] >= pivot) {j--;}arr[i] = arr[j];while (i < j && arr[i] <= pivot) {i++;}arr[j] = arr[i];}arr[i] = pivot;quickSort(arr, left, i - 1);quickSort(arr, i + 1, right);}在代码中,我们首先判断了左右指针是否相遇,防止出现越界的情况。
接着,我们选取了左边第一个元素作为基准点,并使用指针 i 和 j 进行分区操作,最后对左右两个分区进行递归排序。
实现排列组合算法的java代码在Java中,我们可以使用递归或迭代的方法来实现排列和组合。
以下是使用递归方法实现的示例:javaimport java.util.ArrayList;import java.util.List;public class PermutationsCombinations {// 计算排列public static void permute(List<Integer> list, int k) {if (k == list.size()) {System.out.println(list);} else {for (int i = k; i < list.size(); i++) {swap(list, i, k);permute(list, k + 1);swap(list, i, k); // backtrack}}}// 计算组合public static void combine(List<Integer> list, int k) {if (k == 1) {System.out.println(list);} else {for (int i = 0; i < list.size(); i++) {swap(list, 0, i);combine(list, k - 1);swap(list, 0, i); // backtrack}}}// 交换元素的方法private static void swap(List<Integer> list, int i, int j) { int temp = list.get(i);list.set(i, list.get(j));list.set(j, temp);}public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);permute(list, 0); // 计算排列System.out.println();combine(list, 2); // 计算组合}}在这个代码中,permute函数是用来计算给定列表的排列的,而combine函数是用来计算给定列表的组合的。
Java中List排序的三种实现⽅法实例⽬录前⾔1.使⽤ Comparable 排序2.使⽤ Comparator 排序2.1 新建 Comparator ⽐较器2.2 匿名类⽐较器3.使⽤ Stream 流排序总结前⾔在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进⾏排序操作。
⽐如从第三⽅接⼝中获取所有⽤户的列表,但列表默认是以⽤户编号从⼩到⼤进⾏排序的,⽽我们的系统需要按照⽤户的年龄从⼤到⼩进⾏排序,这个时候,我们就需要对 List 集合进⾏⾃定义排序操作了。
L ist 排序的常见⽅法有以下 3 种:1. 使⽤ Comparable 进⾏排序;2. 使⽤ Comparator 进⾏排序;3. 如果是 JDK 8 以上的环境,也可以使⽤ Stream 流进⾏排序。
下⾯我们分别来看各种排序⽅法的具体实现。
1.使⽤ Comparable 排序按照本⽂设计的场景,我们需要创建⼀个包含了⽤户列表的 List 集合,并按⽤户的年龄从⼤到⼩进⾏排序,具体实现代码如下:public class ListSortExample {public static void main(String[] args) {// 创建并初始化 ListList<Person> list = new ArrayList<Person>() {{add(new Person(1, 30, "北京"));add(new Person(2, 20, "西安"));add(new Person(3, 40, "上海"));}};// 使⽤ Comparable ⾃定的规则进⾏排序Collections.sort(list);// 打印 list 集合list.forEach(p -> {System.out.println(p);});}}// 以下 set/get/toString 使⽤的是 lombok 的注解@Getter@Setter@ToStringclass Person implements Comparable<Person> {private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age; = name;}@Overridepublic int compareTo(Person p) {return p.getAge() - this.getAge();}}以上代码的执⾏结果,如下图所⽰:本⽅法的核⼼代码如下:2.使⽤ Comparator 排序Comparable 是类内部的⽐较⽅法,⽽ Comparator 是排序类外部的⽐较器。
⽤Java实现常见的8种内部排序算法⼀、插⼊类排序插⼊类排序就是在⼀个有序的序列中,插⼊⼀个新的关键字。
从⽽达到新的有序序列。
插⼊排序⼀般有直接插⼊排序、折半插⼊排序和希尔排序。
1. 插⼊排序1.1 直接插⼊排序/*** 直接⽐较,将⼤元素向后移来移动数组*/public static void InsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i]; //temp ⽤于存储元素,防⽌后⾯移动数组被前⼀个元素覆盖int j;for(j = i; j > 0 && temp < A[j-1]; j--) { //如果 temp ⽐前⼀个元素⼩,则移动数组A[j] = A[j-1];}A[j] = temp; //如果 temp ⽐前⼀个元素⼤,遍历下⼀个元素}}/*** 这⾥是通过类似于冒泡交换的⽅式来找到插⼊元素的最佳位置。
⽽传统的是直接⽐较,移动数组元素并最后找到合适的位置*/public static void InsertSort2(int[] A) { //A[] 是给定的待排数组for(int i = 0; i < A.length - 1; i++) { //遍历数组for(int j = i + 1; j > 0; j--) { //在有序的序列中插⼊新的关键字if(A[j] < A[j-1]) { //这⾥直接使⽤交换来移动元素int temp = A[j];A[j] = A[j-1];A[j-1] = temp;}}}}/*** 时间复杂度:两个 for 循环 O(n^2)* 空间复杂度:占⽤⼀个数组⼤⼩,属于常量,所以是 O(1)*/1.2 折半插⼊排序/** 从直接插⼊排序的主要流程是:1.遍历数组确定新关键字 2.在有序序列中寻找插⼊关键字的位置* 考虑到数组线性表的特性,采⽤⼆分法可以快速寻找到插⼊关键字的位置,提⾼整体排序时间*/public static void BInsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i];//⼆分法查找int low = 0;int high = i - 1;int mid;while(low <= high) {mid = (high + low)/2;if (A[mid] > temp) {high = mid - 1;} else {low = mid + 1;}}//向后移动插⼊关键字位置后的元素for(int j = i - 1; j >= high + 1; j--) {A[j + 1] = A[j];}//将元素插⼊到寻找到的位置A[high + 1] = temp;}}2. 希尔排序希尔排序⼜称缩⼩增量排序,其本质还是插⼊排序,只不过是将待排序列按某种规则分成⼏个⼦序列,然后如同前⾯的插⼊排序⼀般对这些⼦序列进⾏排序。
java数组排序sort升序,java数组排序sort降序1. java数组排序直接选择排序import ng.*;import java.util.*;public class Main {public static void main(String args[]) {int a[] = new int[]{1, 4, 612, 333, -8, 2, -12, 4534, 0};for (int i = 0; i < a.length; i++) { //直接选择排序(两重for循环排序)for (int j = i + 1; j < a.length; j++) {if (a[i] > a[j]) {int temp = a[j];a[j] = a[i];a[i] = temp;}}}for (int i = 0; i < a.length; i++)System.out.print(a[i] + "\t");System.out.println();}}运⾏结果-12 -8 0 1 2 4 333 612 45342. java数组排序sort排序Arrays 是java的util包下的数组⼯具类,其中提供默认的sort排序.public class Main {public static void main(String args[]) {int[] arr = {1, 4, 612, 333, -8, 2, -12, 4534, 0};Arrays.sort(arr); //默认从⼩到⼤进⾏sort()排序for (int i = 0; i < arr.length; i++)System.out.print(arr[i] + "\t");System.out.println();}}结果-12 -8 0 1 2 4 333 612 45343. javasort降序排序可以将升序的数组倒序输出,即可实现降序排序了。
java8集合自定义排序方法Java 8新增了一些功能,使得在集合中进行自定义排序变得更加简单和灵活。
在Java 8中,可以使用lambda表达式和函数式接口来实现自定义排序方法。
在Java 8中,集合类(如List、Set、Map)都新加了一个sort方法,该方法接收一个Comparator接口的实现作为参数,用于定义自定义排序规则。
Comparator接口是一个函数式接口,只有一个抽象方法compare(Object obj1, Object obj2)。
该方法接收两个对象作为参数,返回一个int类型的值,用于比较两个对象的大小。
其中,返回值为负数表示obj1应排在obj2之前,返回值为正数表示obj1应排在obj2之后,返回值为0表示两个对象相等。
下面是一个例子,展示如何使用lambda表达式和Comparator接口来实现自定义排序:List<String> names = Arrays.asList("Bob", "Alice", "Charlie", "David");使用lambda表达式和Comparator接口排序names.sort((String name1, String name2) -> name1pareTo(name2));打印排序后的结果names.forEach(System.out::println);在上面的例子中,首先创建了一个包含四个字符串的List对象names。
然后使用sort方法和lambda表达式来定义自定义排序规则。
在lambda表达式中,调用了String类的compareTo方法来比较两个字符串的大小。
最后使用forEach方法遍历并打印排序后的结果。
除了使用lambda表达式,还可以使用方法引用来实现自定义排序。
方法引用是一种简化lambda表达式的语法。
Java语⾔利⽤Collections.sort对Map,List排序1.main⽅法包含TreeMap排序1,TreeMap排序2,HashMap排序,List<Integer>排序,List<Bean>排序,List<Map>排序package com.tao.test;import java.util.ArrayList;import java.util.Collections;import parator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.TreeMap;public class Sort {public static void main(String[] args) {// TreeMap排序1Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {public int compare(String o1, String o2) {// 升序排序return pareTo(o2);}});treeMap.put("c", "ccccc");treeMap.put("a", "aaaaa");treeMap.put("b", "bbbbb");treeMap.put("d", "ddddd");// 排序后输出for (String key : treeMap.keySet()) {System.out.println("Key=" + key + ", Value=" + treeMap.get(key));}// TreeMap排序2Map<String, Integer> treeMap2 = new TreeMap<String, Integer>();treeMap2.put("d", 3);treeMap2.put("b", 4);treeMap2.put("a", 7);treeMap2.put("c", 1);// 转换成listList<Map.Entry<String, Integer>> treeList = new ArrayList<Map.Entry<String, Integer>>(treeMap2.entrySet());Collections.sort(treeList, new Comparator<Map.Entry<String, Integer>>() {// 升序排序public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {return o1.getValue().compareTo(o2.getValue());}});// 排序后输出for (Map.Entry<String, Integer> m : treeList) {System.out.println("Key=" + m.getKey() + ", Value=" + m.getValue());}// HashMap排序Map<String, Integer> hashMap = new HashMap<String, Integer>();hashMap.put("c", 3);hashMap.put("a", 2);hashMap.put("b", 1);hashMap.put("d", 4);List<Map.Entry<String, Integer>> hashList = new ArrayList<Map.Entry<String, Integer>>(hashMap.entrySet());Collections.sort(hashList, new Comparator<Map.Entry<String, Integer>>() {// 升序排序public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {return o1.getValue().compareTo(o2.getValue());}});// 排序后输出for (Map.Entry<String, Integer> m : hashList) {System.out.println("Key=" + m.getKey() + ", Value=" + m.getValue());}// List<Integer>排序List<Integer> nums = new ArrayList<Integer>();nums.add(3);nums.add(5);nums.add(2);nums.add(1);// 升序排序(默认)Collections.sort(nums);// 排序后输出System.out.println(nums);// List<Bean>排序List<User> users = new ArrayList<User>();users.add(new User(2, "jack"));users.add(new User(1, "tom"));users.add(new User(3, "keck"));users.add(new User(4, "tao"));// id升序排序Collections.sort(users);// 排序后输出for (User user : users) {System.out.println(user.getId() + "," + user.getName());}// List<Map>排序List<Map<String, Integer>> listMap = new ArrayList<Map<String, Integer>>(); Map<String, Integer> map = new HashMap<>();map.put("age", 20);map.put("sex", 1);listMap.add(map);Map<String, Integer> map2 = new HashMap<>();map2.put("age", 29);map2.put("sex", 2);listMap.add(map2);Map<String, Integer> map3 = new HashMap<>();map3.put("age", 35);map3.put("sex", 1);listMap.add(map3);// 按照map值排序Collections.sort(listMap, new Comparator<Map<String, Integer>>() {@Overridepublic int compare(Map<String, Integer> o1, Map<String, Integer> o2) {return o1.get("age").compareTo(o2.get("age"));// age升序排序}});// 排序后输出for (Map<String, Integer> m : listMap) {System.out.println(m);}}}2.List<User>排序的User.java类:package com.tao.test;public class User implements Comparable<User>{private int id;private String name;public User(int id, String name) {super();this.id = id; = name;}public String getName() {return name;}public void setName(String name) { = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic int compareTo(User o) {return this.id - o.getId();//id升序排序}}3.运⾏截图。
Java字符串排序方法介绍字符串在很多应用中都是一个重要的数据类型。
Java语言提供了多种方法来对字符串进行排序,以满足不同场景的需求。
本文将介绍几种常见的Java字符串排序方法。
目录1.字典序排序2.按字符串长度排序3.自定义排序规则4.忽略大小写排序5.多条件排序6.总结字典序排序字典序(lexicographical order)是根据字符在字母表中的顺序进行排序。
Java 的String类实现了Comparable接口,所以可以直接使用Collections类的sort方法进行字典序排序。
import java.util.ArrayList;import java.util.Collections;import java.util.List;public class LexicographicalOrder {public static void main(String[] args) {List<String> strings = new ArrayList<>();strings.add("apple");strings.add("banana");strings.add("cat");strings.add("dog");Collections.sort(strings);for (String str : strings) {System.out.println(str);}}}输出结果为:applebananacatdog通过调用Collections.sort方法,可以对字符串列表按字典序进行排序。
按字符串长度排序有时候需要根据字符串的长度进行排序,可以通过实现Comparator接口来自定义排序规则。
下面的例子演示了如何按照字符串长度进行排序。
import java.util.ArrayList;import java.util.Collections;import parator;import java.util.List;public class SortByLength {public static void main(String[] args) {List<String> strings = new ArrayList<>();strings.add("apple");strings.add("banana");strings.add("cat");strings.add("dog");Collections.sort(strings, new LengthComparator());for (String str : strings) {System.out.println(str);}}static class LengthComparator implements Comparator<String> {@Overridepublic int compare(String o1, String o2) {return o1.length() - o2.length();}}}输出结果为:catdogapplebanana自定义排序规则除了按照字典序和字符串长度排序,还可以根据其他要求定义自己的排序规则。
Java是一门广泛应用于软件开发领域的编程语言,其强大的排序和逆序功能以及灵活的Lambda表达式在实际开发中有着重要的作用。
本文将主要从以下几个方面对Java中的排序、逆序和Lambda表达式进行讨论。
一、排序在实际的软件开发中,对数据进行排序是非常常见的需求。
Java中提供了丰富的排序算法和方法,可以轻松地对数组、集合等数据结构进行排序操作。
1.1 数组排序Java中的数组排序可以使用Arrays类提供的sort()方法进行排序。
该方法使用快速排序算法对数组进行排序,其基本语法如下所示:```javaint[] arr = {5, 2, 9, 1, 7};Arrays.sort(arr);```1.2 集合排序除了对数组进行排序外,Java中的集合框架也提供了丰富的排序功能。
通过Collections类提供的sort()方法,可以对List、Set等集合进行排序操作。
下面是对List集合进行排序的示例代码:```javaList<Integer> list = new ArrayList<>();list.add(5);list.add(2);list.add(9);list.add(1);list.add(7);Collections.sort(list);```1.3 自定义排序除了使用Java提供的默认排序功能外,开发人员还可以根据自己的需求实现自定义的排序规则。
可以通过实现Comparator接口来定义自定义的比较器,并将其传递给排序方法,从而实现自定义排序。
以下是一个对自定义对象进行排序的示例代码:```javaclass Student {private String name;private int age;// 省略其他代码}List<Student> studentList = new ArrayList<>();// 添加学生对象到列表中// 省略其他代码Collections.sort(studentList, (s1, s2) -> s1.getAge() - s2.getAge()); ```二、逆序除了常规的升序排序,有时候还需要对数据进行逆序操作。
《Java8函数式实现集合多条件排序》在软件开发中,数据的排序是一个常见而重要的操作。
在实际开发中,我们经常需要根据多个条件对数据进行排序,以满足不同的业务需求。
在Java8之前,要实现多条件排序需要写大量的代码,而Java8的函数式编程特性为我们提供了一种更简洁、灵活的方式来实现多条件排序。
1. Java8函数式编程简介Java8引入了lambda表达式和函数式接口,可以方便地实现函数式编程。
函数式编程是一种编程范式,它将函数作为一等公民,并提供了丰富的操作函数的方法,比如map、reduce、filter等。
在函数式编程中,我们可以将函数作为参数传递给其他函数,这为实现多条件排序提供了便利。
2. 实现集合多条件排序假设我们有一个学生类Student,包含学生的尊称、芳龄和成绩三个属性。
现在我们需要按照尊称、芳龄和成绩的顺序对学生进行排序。
在Java8之前,我们可能需要编写多个Comparator来实现多条件排序,而在Java8中,我们可以使用Comparator的thenComparing方法来实现多条件排序。
```javaList<Student> students = new ArrayList<>();// 添加学生数据// 按尊称升序、芳龄降序、成绩升序排序students.sort(paring(Student::getName).thenComparing(Student::getAge,Comparator.reverseOrder()).thenComparing(Student::getScore));```在这段代码中,我们使用了paring和thenComparing方法来实现多条件排序。
首先按照尊称升序排序,然后在尊称相同时按照芳龄降序排序,最后在尊称和芳龄相同时按照成绩升序排序。
这样,我们就实现了对学生集合的多条件排序。
3. 个人观点和理解Java8的函数式编程让多条件排序变得简单而灵活。
java中的排序(⾃定义数据排序)--使⽤Collections的sort⽅法排序:将⼀组数据按相应的规则排列顺序1.规则:基本数据类型:⽇常的⼤⼩排序。
引⽤类型:a. 内置引⽤类型(String,Integer..),内部已经指定规则,直接使⽤即可。
----实现Comparable接⼝ 1. 整数、 Integer..:根据基本数据类型⼤⼩ 2. Character(字符):根据Unicode编码顺序 3. String(字符串): 1)如果其中⼀个是另⼀个起始开始的⼦串,返回长度之差, 2)否则返回第⼀个不相等的Unicode之差。
4. ⽇期:根据⽇期的长整型数⽐较。
b. ⾃定义引⽤类型,需要按照业务规则排序。
有两种⽅式,分别如下所述: 当引⽤类型的内置排序⽅式⽆法满⾜需求时可以⾃⼰实现满⾜既定要求的排序,有两种⽅式: 第⼀种:⾃定义业务排序类:新建⼀个业务排序类实现parator 下的compare 接⼝,然后使⽤java提供的Collections 调⽤排序⽅法,并将此业务排序类作为参数传递给Collections的sort⽅法,如下:(1)新建⼀个实体类,如下package top.wfaceboss.sort.refType2;public class Goods {// 价格private double price;// 商品名称private String name;// 收藏量private int fav;public Goods() {}public Goods(String name,double price, int fav) {super();this.price = price; = name;this.fav = fav;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getName() {return name;}public void setName(String name) { = name;}public int getFav() {return fav;}public void setFav(int fav) {this.fav = fav;}@Overridepublic String toString() {return "商品名:" + + ",收藏量:" + this.fav + ",价格:" + this.price + "\n";}}View Code (2)新建业务排序类(实现parator接⼝),编写符合业务要求的排序⽅法,如下是按照价格排序的业务类(降序)package top.wfaceboss.sort.refType2;/*** 按照价格排序的业务类(降序)** @author Administrator**/public class GoodsPriceCompare implements parator<Goods> {@Overridepublic int compare(Goods o1, Goods o2) {return -(o1.getPrice()-o2.getPrice()>0?1:o1.getPrice()==o2.getPrice()?0:-1);//降序}}View Code (3)使⽤业务排序类package top.wfaceboss.sort.refType2;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class GoodsApp {public static void main(String[] args) {List<Goods> list = new ArrayList<Goods>();list.add(new Goods("⽼马视频", 100, 2000));list.add(new Goods("⽼⾼视频", 50, 2000));list.add(new Goods("⽼裴视频", 1000, 1000));System.out.println("排序前:" + list);Collections.sort(list,new GoodsPriceCompare());System.out.println("排序后:"+list);}} 第⼆种:实体类实现 parable下的compareTo接⼝,在接⼝中实现满⾜需求的,然后使⽤java提供的Collections调⽤排序⽅法sort,会⾃动调⽤此时实现的接⼝⽅法。
JavaMap实现按value从⼤到⼩排序⾸先说⼀下如果Map对key进⾏从⼩到⼤默认排序是创建TreeMap对象。
Map<Integer,Integer> maps = new TreeMap<>();就⾏了。
那么如何实现按value排序呢?这⾥使⽤的是java.util.Collections类实现排序,将Map转成List,再⾃定义⽐较器,代码如下:package day01_jichu;import java.util.ArrayList;import java.util.Collections;import parator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.TreeMap;public class MapValSort {public static void main(String[] args) {Map<String, Integer> maps = new TreeMap<String, Integer>();maps.put("zhangsan", 22);maps.put("lisi", 24);maps.put("wangwu", 18);maps.put("zhaoliu", 22);//⾃定义⽐较器Comparator<Map.Entry<String, Integer>> valCmp = new Comparator<Map.Entry<String,Integer>>() {@Overridepublic int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {// TODO Auto-generated method stubreturn o2.getValue()-o1.getValue(); // 降序排序,如果想升序就反过来}};//将map转成List,map的⼀组key,value对应list⼀个存储空间List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(maps.entrySet()); //传⼊maps实体Collections.sort(list,valCmp); // 注意此处Collections 是java.util包下⾯的,传⼊List和⾃定义的valCmp⽐较器//输出mapfor(int i=0;i<list.size();i++) {System.out.println(list.get(i).getKey() + " = " + list.get(i).getValue());}}}。
分类:1)插入排序(直接插入排序、希尔排序)2)交换排序(冒泡排序、快速排序)3)选择排序(直接选择排序、堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序。
先来看看8种排序之间的关系:1.直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。
如此反复循环,直到全部排好顺序。
(2)实例(3)用java实现12345678911121314151617181920package com.njue;publicclass insertSort {public insertSort(){inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,2 5,53,51};int temp=0;for(int i=1;i<a.length;i++){int j=i-1;temp=a[i];for(;j>=0&&temp<a[j];j--){a[j+1]=a[j]; //将大于temp的值整体后移一个单位}a[j+1]=temp;}for(int i=0;i<a.length;i++){System.out.println(a[i]);}2. 希尔排序(最小增量排序)(1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。
当增量减到1时,进行直接插入排序后,排序完成。
(2)实例:(3)用java实现123456789101112131415161718192122232425262728293031publicclass shellSort { publicshellSort(){int a[]={1,54,6,3,78,34,12,45,56,100}; double d1=a.length;int temp=0;while(true){d1= Math.ceil(d1/2);int d=(int) d1;for(int x=0;x<d;x++){for(int i=x+d;i<a.length;i+=d){int j=i-d;temp=a[i];for(;j>=0&&temp<a[j];j-=d){a[j+d]=a[j];}a[j+d]=temp;}}if(d==1){break;}for(int i=0;i<a.length;i++){System.out.println(a[i]);}}3.简单选择排序(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
java算法代码实现一、Java算法概述Java算法是指在Java编程语言中实现的各种计算机算法。
它们可以用于解决各种问题,例如排序、搜索、图形处理和数据分析等。
Java算法通常由一组指令组成,这些指令按照特定的顺序执行,以达到预期的结果。
二、Java算法的分类根据不同的标准,Java算法可以分为不同的类别。
以下是常见的分类方式:1. 基本排序算法:包括冒泡排序、选择排序和插入排序等。
2. 高级排序算法:包括快速排序、归并排序和堆排序等。
3. 搜索算法:包括线性搜索和二分搜索等。
4. 图形处理算法:包括图像滤波和边缘检测等。
5. 数据分析算法:包括聚类分析和分类器等。
三、Java基本排序算法代码实现以下是三种基本排序算法(冒泡排序、选择排序和插入排序)的Java 代码实现:1. 冒泡排序public static void bubbleSort(int[] arr) { int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}2. 选择排序public static void selectionSort(int[] arr) { int n = arr.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}3. 插入排序public static void insertionSort(int[] arr) { int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && key < arr[j]) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}四、Java高级排序算法代码实现以下是三种高级排序算法(快速排序、归并排序和堆排序)的Java代码实现:1. 快速排序public static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivotIndex = partition(arr, low, high);quickSort(arr, low, pivotIndex - 1);quickSort(arr, pivotIndex + 1, high);}}private static int partition(int[] arr, int low, int high) {int pivotValue = arr[high];int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivotValue) {i++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;}2. 归并排序public static void mergeSort(int[] arr, int low, int high) {if (low < high) {int mid = (low + high) / 2;mergeSort(arr, low, mid);mergeSort(arr, mid + 1, high);merge(arr, low, mid, high);}}private static void merge(int[] arr, int low, int mid, int high) { int[] tempArr = new int[arr.length];for (int i = low; i <= high; i++) {tempArr[i] = arr[i];}int i = low;int j = mid + 1;int k = low;while (i <= mid && j <= high) {if (tempArr[i] <= tempArr[j]) {arr[k++] = tempArr[i++];} else {arr[k++] = tempArr[j++];}}while (i <= mid) {arr[k++] = tempArr[i++];}}3. 堆排序public static void heapSort(int[] arr) { buildMaxHeap(arr);for (int i = arr.length - 1; i >= 0; i--) { swap(arr, 0, i);maxHeapify(arr, 0, i);}}private static void buildMaxHeap(int[] arr) {int n = arr.length;for (int i = n / 2 - 1; i >= 0; i--) {maxHeapify(arr, i, n);}}private static void maxHeapify(int[] arr, int i, int heapSize) { int left = i * 2 + 1;int right = i * 2 + 2;int largestIndex = i;if (left < heapSize && arr[left] > arr[largestIndex]) {largestIndex = left;}if (right < heapSize && arr[right] > arr[largestIndex]) { largestIndex = right;}if (largestIndex != i) {swap(arr, i, largestIndex);maxHeapify(arr, largestIndex, heapSize);}}private static void swap(int[] arr, int a, int b) {int temp = arr[a];arr[a] = arr[b];arr[b] = temp;}五、Java搜索算法代码实现以下是两种搜索算法(线性搜索和二分搜索)的Java代码实现:1. 线性搜索public static boolean linearSearch(int[] arr, int target) {for (int num : arr) {if (num == target) {return true;}}return false;}2. 二分搜索public static boolean binarySearch(int[] sortedArr, int target) { int low = 0;int high = sortedArr.length - 1;while (low <= high) {int mid = (low + high) / 2;if (sortedArr[mid] == target) {return true;} else if (sortedArr[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return false;}六、Java图形处理算法代码实现以下是两种图形处理算法(图像滤波和边缘检测)的Java代码实现:1. 图像滤波public static BufferedImage blurFilter(BufferedImage image, int radius) {int width = image.getWidth();int height = image.getHeight();BufferedImage resultImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {int rgbSumRed = 0;int rgbSumGreen = 0;int rgbSumBlue = 0;int count = 0;for (int i = -radius; i <= radius; i++) {for (int j = -radius; j <= radius; j++) {if (x + i >= 0 && x + i < width && y + j >= 0 && y + j < height) {int rgbValue = image.getRGB(x + i, y + j);rgbSumRed += (rgbValue >> 16) & 255;rgbSumGreen += (rgbValue >> 8) & 255;rgbSumBlue += rgbValue & 255;count++;}}}int avgRed = rgbSumRed / count;int avgGreen = rgbSumGreen / count;int avgBlue = rgbSumBlue / count;resultImage.setRGB(x, y, (avgRed << 16) | (avgGreen << 8) | avgBlue);}}return resultImage;}2. 边缘检测public static BufferedImage edgeDetection(BufferedImage image) {int width = image.getWidth();int height = image.getHeight();BufferedImage resultImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);int[][] gx = {{-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1}};int[][] gy = {{-1, -2, -1}, {0, 0, 0}, {1, 2, 1}};for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {int gxSumRed = 0;int gxSumGreen = 0;int gxSumBlue = 0;int gySumRed = 0;int gySumGreen = 0;int gySumBlue = 0;for (int i = -1; i <= 1; i++) {for (int j = -1; j <= 1; j++) {if (x + i >= 0 && x + i < width && y + j >= 0 && y + j < height) {Color colorValue = new Color(image.getRGB(x + i, y + j));gxSumRed += colorValue.getRed() * gx[i + 1][j + 1];gxSumGreen += colorValue.getGreen() * gx[i + 1][j + 1];gxSumBlue += colorValue.getBlue() * gx[i + 1][j + 1];gySumRed += colorValue.getRed() * gy[i + 1][j + 1];gySumGreen += colorValue.getGreen() * gy[i + 1][j + 1];gySumBlue += colorValue.getBlue() * gy[i + 1][j + 1];}}}int red = (int) Math.sqrt(gxSumRed * gxSumRed + gySumRed * gySumRed);int green = (int) Math.sqrt(gxSumGreen * gxSumGreen + gySumGreen * gySumGreen);int blue = (int) Math.sqrt(gxSumBlue * gxSumBlue + gySumBlue * gySumBlue);red = Math.min(red, 255);green = Math.min(green, 255);blue = Math.min(blue, 255);resultImage.setRGB(x, y, (red << 16) | (green << 8) | blue);}}return resultImage;}七、Java数据分析算法代码实现以下是两种数据分析算法(聚类分析和分类器)的Java代码实现:1. 聚类分析public static List<List<double[]>> kMeansClustering(List<double[]> dataList, int k) {List<List<double[]>> clustersList = new ArrayList<>(); for (int i = 0; i < k; i++) {clustersList.add(new ArrayList<>());}double[][] centroidsArr = newdouble[k][dataList.get(0).length];for (int i = 0; i < k; i++) {centroidsArr[i] = dataList.get(i);clustersList.get(i).add(dataList.get(i));}while (true) {boolean changed = false;for (double[] data : dataList) {int nearestCentroidIndex = 0;double nearestDistance = Double.MAX_VALUE; for (int i = 0; i < k; i++) {double distance = euclideanDistance(data, centroidsArr[i]);if (distance < nearestDistance) {nearestCentroidIndex = i;nearestDistance = distance;}}if (!clustersList.get(nearestCentroidIndex).contains(data)) {for (List<double[]> cluster : clustersList) {if (cluster.contains(data)) {cluster.remove(data);break;}}clustersList.get(nearestCentroidIndex).add(data);changed = true;}}if (!changed) {break;}for (int i = 0; i < k; i++) {double[] newCentroid =calculateCentroid(clustersList.get(i));centroidsArr[i] = newCentroid;}}return clustersList;}private static double euclideanDistance(double[] a, double[] b) { double sumSquares = 0.0;for (int i = 0; i < a.length; i++) {sumSquares += Math.pow(a[i] - b[i], 2);}return Math.sqrt(sumSquares);}private static double[] calculateCentroid(List<double[]> dataList) {int dimensions = dataList.get(0).length;double[] centroidArr = new double[dimensions];for (int d = 0; d < dimensions; d++) {double sumValuesInDimension = 0.0;for (double[] data : dataList) {sumValuesInDimension += data[d];}centroidArr[d] = sumValuesInDimension / dataList.size(); }return centroidArr;}2. 分类器public static String kNearestNeighborsClassifier(List<double[]> trainingDataList, List<String> trainingLabelList,double[] testData, int k) {double[][] distancesAndLabelsArr = newdouble[trainingDataList.size()][2];for (int i = 0; i < trainingDataList.size(); i++) {distancesAndLabelsArr[i][0] = euclideanDistance(testData, trainingDataList.get(i));distancesAndLabelsArr[i][1] =Double.parseDouble(trainingLabelList.get(i));}Arrays.sort(distancesAndLabelsArr,paringDouble(a -> a[0]));Map<Double, Integer> labelCountMap = new HashMap<>(); for (int i = 0; i < k; i++) {double label = distancesAndLabelsArr[i][1];if (labelCountMap.containsKey(label)) {labelCountMap.put(label, labelCountMap.get(label) + 1); } else {labelCountMap.put(label, 1);}}double mostFrequentLabel = -1;int maxLabelCount = -1;for (double label : labelCountMap.keySet()) {int count = labelCountMap.get(label);if (count > maxLabelCount) {maxLabelCount = count;mostFrequentLabel = label;}}return Double.toString(mostFrequentLabel);}private static double euclideanDistance(double[] a, double[] b) { double sumSquares = 0.0;for (int i = 0; i < a.length; i++) {sumSquares += Math.pow(a[i] - b[i], 2);}return Math.sqrt(sumSquares);}八、总结Java算法是计算机科学中的重要部分,可以用于解决各种问题。
在Java中,可以使用Lambda表达式和Comparator接口来对时间进行排序。
假设有一个Date类型的List,可以使用以下代码进行排序:
java复制代码
List<Date> dates = Arrays.asList(date1, date2, date3);
dates.sort(Comparator.naturalOrder());
上述代码将按照自然顺序对日期进行排序。
如果需要按照逆序排序,可以使用Comparator.reverseOrder()方法。
另外,如果需要按照自定义的排序规则对日期进行排序,可以创建一个实现Comparator接口的Lambda表达式:
java复制代码
List<Date> dates = Arrays.asList(date1, date2, date3);
dates.sort((d1, d2) -> pareTo(d1)); // 按照降序排序
上述代码将按照降序对日期进行排序。
如果需要按照升序排序,可以将Lambda表达式修改为(d1, d2) -> pareTo(d2)。
注意,如果需要比较的时间不是Date类型,而是自定义的时间类型,需要根据实际情况进行修改。
交换排序冒泡排序将最后一个元素与倒数第二个元素对比,如果最后一个元素比倒数第二个小,则交换两个元素的位置,再用倒数第二个元素与倒数第三个元数对比,直到比到第一个元素,这样经过第一趟排序后得到第一个最小元素。
如此反复几过N(N=length-1)次后可得到排序结果。
Java代码1.package sort;2.3.import parator;4.5./**6.*冒泡排序算法7.*@author jzj8.*@date2009-12-99.*10.*@param<E>11.*/12.public class BubbleSort<E extends Comparable<E>>extendsSort<E>{13.14./**15.*排序算法的实现,对数组中指定的元素进行排序16.*@param array待排序的数组17.*@param from从哪里开始排序18.*@param end排到哪里19.*@param c比较器20.*/21.public void sort(E[]array,int from,int end,Comparator<E>c){22.//需array.length-1轮比较23.for(int k=1;k<end-from+1;k++){24.//每轮循环中从最后一个元素开始向前起泡,直到i=k止,即i等于轮次止25.for(int i=end-from;i>=k;i--){26.//按照一种规则(后面元素不能小于前面元素)排序27.if(pare(array[i],array[i-1])<0){28.//如果后面元素小于了(当然是大于还是小于要看比较器实现了)前面的元素,则前后交换29.swap(array,i,i-1);30.}31.}32.}33.}34.35./**36.*测试37.*@param args38.*/39.public static void main(String[]args){40.Integer[]intgArr={7,2,4,3,12,1,9,6,8,5,11,10};41.BubbleSort<Integer>sort=new BubbleSort<Integer>();42.BubbleSort.testSort(sort,intgArr);43.BubbleSort.testSort(sort,null);44.}45.}快速排序快速排序采用了分治法的思想,把大的问题分解为同类型的小问题。
一般分如下步骤:1)选择一个中枢元素(有很多选法,我的实现里使用第一个元素为中枢的简单方法)2)以该中枢元素为基准点,将小于中枢的元素放在中枢后集合的前部分,比它大的在集合后部分,待集合基本排序完成后(此时前部分元素小于后部分元素),把中枢元素放在合适的位置。
3)根据中枢元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。
这里的重点与难点在于第二步,实现的方式有很多种,我这里实现了三种。
第一种实现(partition1方法):以第一个元素为中枢元素,在中枢元素后面集合中从前往后寻找第一个比中枢元素小的元素,并与第一个元素交换,然后从剩余的元素中寻找第二个比中枢元素小的元素,并与第二位元素交换,这样直到所有小于中枢元素找完为止,并记下最后一次放置小于中枢的元素位置minIndex(即小于中枢与大于中枢的分界),并将中枢元素与minIndex位置元素互换,然后对中枢元素两边的序列进行同样的操作。
此种实现最为简洁,处理过程中不需要把中枢元素移来移去,只是在其它元素完成基本排序后(前部分小于后部分元素)再把中枢元素放置到适当的位置以第一个元素为中枢元素,刚开始时使用低指针指向中枢元素。
当中枢元素在低指针位置时,此时我们判断高指针指向的元素是否小于中枢元素,如果大于中枢元素则高指针继续向头移动,如果小于则与中枢元素交换,此时中枢元素被移到了高指针位置;当中枢元素在高指针位置时,我们此时判断低指针指向的元素是否大于中枢元素,如果小于中枢元素则低指针继续向尾移动,如果大于则与中枢元素交换,此时中枢元素又回到了低指针位置;这时是拿高还是低指针所指向的元素与中枢比较时根据前面逻辑来处理,直到高低指针指向同一位置则完成一轮排序,然后再对中枢元素两边的序列进行同样的操作直到排序完成此种实现逻辑比较好理解,中枢元素的永远在低指针或指针所指向的位置,每次找到需处理的元素后,要与中枢交换,中枢就像皮球一样从这里踢到那里,又从那里踢到这里。
但此种实现会频繁地交换中枢元素,性能可能不如第一种此种方式与前两种方式不太一样,同时移动高低指针,低指针向尾找出大于等于中枢的元素,而高向头找出小于中枢的元素,待两者都找出后交换高低指针所指向的元素,直到高低指针指向同一位置止,然后比较中枢与高低指针所指向的元素大小,如果中枢元素大,则直接与高低指针元素交换,如果中枢元素小于等于高低指针元素,则中枢元素与高低指针前一元素交换,完成一轮比较,然后再对中枢元素两边的序列进行同样的操作直到排序完成此种方式有点难度,在移动元素时要注意的是:与中枢相等的元素也要向集合后部移动,不然的话如[3,3,0,3,3]第一轮排序结果不准确,虽然最后结果正确。
当中枢后面的元素集合移动完成后,还得要把中枢元素放置在集合中的合适位置,这就需要找准集合中前部分与后部分的边界,最后只能把中枢元素与最后一个小于中枢的元素进位置互换。
但此种实现方式与第一种有点像,也不需要把中枢元素调来调去的,而是待后面集合排序完成后将中枢放入适当位置Java代码1.package sort;2.3.import java.util.Arrays;4.import parator;5.6./**7.*快速排序算法8.*@author jzj9.*@date2009-12-910.*11.*@param<E>12.*/13.public class QuickSort<E extends Comparable<E>>extends Sort<E>{14.15./**16.*排序算法的实现,对数组中指定的元素进行排序17.*@param array待排序的数组18.*@param from从哪里开始排序19.*@param end排到哪里20.*@param c比较器21.*/22.public void sort(E[]array,int from,int end,Comparator<E>c){23.quickSort(array,from,end,c);24.}25.26./**27.*递归快速排序实现28.*@param array待排序数组29.*@param low低指针30.*@param high高指针31.*@param c比较器32.*/33.private void quickSort(E[]array,int low,int high,Comparator<E>c){34./*35.*如果分区中的低指针小于高指针时循环;如果low=higth说明数组只有一个元素,无需再处理;36.*如果low>higth,则说明上次枢纽元素的位置pivot就是low或者是higth,此种情况37.*下分区不存,也不需处理39.if(low<high){40.//对分区进行排序整理41.int pivot=partition1(array,low,high,c);42./*43.*以pivot为边界,把数组分成三部分[low,pivot-1]、[pivot]、[pivot+1,high]44.*其中[pivot]为枢纽元素,不需处理,再对[low,pivot-1]与[pivot+1,high]45.*各自进行分区排序整理与进一步分区46.*/47.quickSort(array,low,pivot-1,c);48.quickSort(array,pivot+1,high,c);49.}50.51.}52.53./**54.*实现一55.*56.*@param array待排序数组57.*@param low低指针58.*@param high高指针59.*@param c比较器60.*@return int调整后中枢位置61.*/62.private int partition1(E[]array,int low,int high,Comparator<E>c){63.E pivotElem=array[low];//以第一个元素为中枢元素64.//从前向后依次指向比中枢元素小的元素,刚开始时指向中枢,也是小于与大小中枢的元素的分界点65.int border=low;66.67./*68.*在中枢元素后面的元素中查找小于中枢元素的所有元素,并依次从第二个位置从前往后存放69.*注,这里最好使用i来移动,如果直接移动low的话,最后不知道数组的边界了,但后面需要70.*知道数组的边界72.for(int i=low+1;i<=high;i++){73.//如果找到一个比中枢元素小的元素74.if(pare(array[i],pivotElem)<0){75.swap(array,++border,i);//border前移,表示有小于中枢元素的元素76.}77.}78./*79.*如果border没有移动时说明说明后面的元素都比中枢元素要大,border与low相等,此时是80.*同一位置交换,是否交换都没关系;当border移到了high时说明所有元素都小于中枢元素,此81.*时将中枢元素与最后一个元素交换即可,即low与high进行交换,大的中枢元素移到了序列最82.*后;如果low<minIndex<high,表明中枢后面的元素前部分小于中枢元素,而后部分大于83.*中枢元素,此时中枢元素与前部分数组中最后一个小于它的元素交换位置,使得中枢元素放置在84.*正确的位置85.*/86.swap(array,border,low);87.return border;88.}89.90./**91.*实现二92.*93.*@param array待排序数组94.*@param low待排序区低指针95.*@param high待排序区高指针96.*@param c比较器97.*@return int调整后中枢位置98.*/99.private int partition2(E[]array,int low,int high,Comparator<E>c){100.int pivot=low;//中枢元素位置,我们以第一个元素为中枢元素101.//退出条件这里只可能是low=high102.while(true){103.if(pivot!=high){//如果中枢元素在低指针位置时,我们移动高指针104.//如果高指针元素小于中枢元素时,则与中枢元素交换105.if(pare(array[high], array[pivot])<0){106.swap(array,high, pivot);107.//交换后中枢元素在高指针位置了108.pivot=high;109.}else{//如果未找到小于中枢元素,则高指针前移继续找110.high--;111.}112.}else{//否则中枢元素在高指针位置113.//如果低指针元素大于中枢元素时,则与中枢元素交换114.if(pare(array[low], array[pivot])>0){115.swap(array,low, pivot);116.//交换后中枢元素在低指针位置了117.pivot=low;118.}else{//如果未找到大于中枢元素,则低指针后移继续找119.low++;120.}121.}122.if(low==high){123.break;124.}125.}126.//返回中枢元素所在位置,以便下次分区127.return pivot;128.}129.130./**131.*实现三132.*133.*@param array待排序数组134.*@param low待排序区低指针135.*@param high待排序区高指针136.*@param c比较器137.*@return int调整后中枢位置138.*/139.private int partition3(E[]array,int low,i nt high,Comparator<E>c){140.int pivot=low;//中枢元素位置,我们以第一个元素为中枢元素141.low++;142.//----调整高低指针所指向的元素顺序,把小于中枢元素的移到前部分,大于中枢元素的移到后面部分143.//退出条件这里只可能是low=high144.145.while(true){146.//如果高指针未超出低指针147.while(low<high){148.//如果低指针指向的元素大于或等于中枢元素时表示找到了,退出,注:等于时也要后移149.if(pare(array[low], array[pivot])>=0){150.break;151.}else{//如果低指针指向的元素小于中枢元素时继续找152.low++;153.}154.}155.156.while(high>low){157.//如果高指针指向的元素小于中枢元素时表示找到,退出158.if(pare(array[high], array[pivot])<0){159.break;160.}else{//如果高指针指向的元素大于中枢元素时继续找161.high--;162.}163.}164.//退出上面循环时low=high165.if(low==high){166.break;167.}168.169.swap(array,low,high);170.}171.172.//----高低指针所指向的元素排序完成后,还得要把中枢元素放到适当的位置173.if(pare(array[pivot],array[low]) >0){174.//如果退出循环时中枢元素大于了低指针或高指针元素时,中枢元素需与low元素交换175.swap(array,low,pivot);176.pivot=low;177.}else if(pare(array[pivot],arr ay[low])<=0){178.swap(array,low-1,pivot);179.pivot=low-1;180.}181.182.//返回中枢元素所在位置,以便下次分区183.return pivot;184.}185.186./**187.*测试188.*@param args189.*/190.public static void main(String[]args){191.Integer[]intgArr={3,1,1,1, 1,1,1};192.QuickSort<Integer>sort=new QuickSor t<Integer>();193.QuickSort.testSort(sort,intgArr);194.QuickSort.testSort(sort,null);195.}196.}归并排序Java代码1.package sort;2.3.import ng.reflect.Array;4.import parator;5.6./**7.*归并排序算法8.*@author jzj9.*@date2009-12-1110.*11.*@param<E>12.*/13.public class MergeSort<E extends Comparable<E>>extends Sort<E>{14.15./**16.*排序算法的实现,对数组中指定的元素进行排序17.*@param array待排序的数组18.*@param from从哪里开始排序19.*@param end排到哪里20.*@param c比较器21.*/22.public void sort(E[]arr,int from,int end,Comparator<E>c){23.partition(arr,from,end,c);24.}25.26./**27.*递归划分数组28.*@param arr29.*@param from30.*@param end31.*@param c void32.*/33.private void partition(E[]arr,int from,int end,Comparator<E>c){34.//划分到数组只有一个元素时才不进行再划分35.if(from<end){36.//从中间划分成两个数组37.int mid=(from+end)/2;38.partition(arr,from,mid,c);39.partition(arr,mid+1,end,c);40.//合并划分后的两个数组41.merge(arr,from,end,mid,c);42.}43.}44.45./**46.*数组合并,合并过程中对两部分数组进行排序47.*前后两部分数组里是有序的48.*@param arr49.*@param from50.*@param end51.*@param mid52.*@param c void53.*/54.private void merge(E[]arr,int from,int end,int mid,Comparator<E>c){55.E[]tmpArr=(E[])Array.newInstance(arr[0].getClass(),end-from+1);56.int tmpArrIndex=0;//指向临时数组57.int part1ArrIndex=from;//指向第一部分数组58.int part2ArrIndex=mid+1;//指向第二部分数组59.60.//由于两部分数组里是有序的,所以每部分可以从第一个元素依次取到最后一个元素,再对两部分61.//取出的元素进行比较。