Java 数据结构之数组的操作三:实现各种排序方法
发布日期:2021-06-30 22:37:38 浏览次数:2 分类:技术文章

本文共 8335 字,大约阅读时间需要 27 分钟。

使用对象数组实现各种排序方法

package com.java.array;/** * @描述         TODO * @项目名称      Java_DataStruct * @包名         com.java.array * @类名         Person * @author      chenlin * @date        2010年5月23日 下午7:24:53 * @version     1.0 */public class Person {
private String name; private int age; private String sex; public Person() { super(); } public Person(String name, int age, String sex) { super(); this.name = name; this.age = age; this.sex = sex; } public void list(){ System.out.print("name=" + name); System.out.print(" age=" + age); System.out.println(" sex="+sex); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((sex == null) ? 0 : sex.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (sex == null) { if (other.sex != null) return false; } else if (!sex.equals(other.sex)) return false; return true; }}

数组实现:

package com.java.array;/** * @描述 TODO * @项目名称 Java_DataStruct * @包名 com.java.array * @类名 PersonArray * @author chenlin * @date 2016年5月23日 下午7:27:02 * @version 1.0 */public class PersonArray {
private Person[] arr; // 有效数据大小 private int len; public PersonArray(int max) { arr = new Person[max]; } /** * 初始化 */ public void init(Person value) { arr[len] = value; len++; } /** * 在有顺序的数组插入 */ public void insert(Person value) { int j; for (j = 0; j < len; j++) { //从这里可以获得j的值 if (arr[j].getName().compareTo(value.getName()) > 0 ) { break; } } for (int i = len; i > j; i--) { arr[i]=arr[i-1]; } arr[j] = value; len ++; } /** * 列出 */ public void list() { for (int i = 0; i < len; i++) { arr[i].list(); } System.out.println(); } /** * 查找 * * @param value */ public int search(String name) { int i; for (i = 0; i < len; i++) { if (name.equals(arr[i].getName())) { break; } } if (i == len) { return -1; } else { return i; } } /** * 使用二分查找法 * @param key */ public int binarySearch(String name){ int min = 0; int max = len; int mid = 0; while(true){ mid = (min + max)/2; if (name.equals(arr[mid].getName())) { return mid; }else if (min > max) { return -1; }else { if (arr[mid].getName().compareTo(name)>0) { max = mid - 1; }else { min = mid + 1; } } } } /** * 删除 * * @param key */ public void delete(String key) { if (search(key) == -1) { System.out.println("not found"); } else { for (int i = search(key); i < len; i++) { arr[i] = arr[i + 1]; } } len --; list(); } /** * 修改 * * @param lastData * @param newData */ public void edit(String name, Person person) { if (search(name) == -1) { System.out.println("not found"); } else { arr[search(name)] = person; } list(); } /** * 1、使用冒泡排序,按年纪从小到大排列 * * 核心思想:就是相邻的两个数比较,小的排前面,大的排后面 */ public void bubbleSort() { Person temp; for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - 1 - i; j++) { if (arr[j].getAge() > arr[j + 1].getAge()) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } list(); } /** * 2、选择排序,按年纪从大到小排列 * * 核心思想:把第一个元素当作最大的,依次与其后面的元素比较,如果有比其大的,与最小的元素替换 */ public void selectSort() { Person temp; for (int i = 0; i < len - 1; i++) { for (int j = i + 1; j < len; j++) { if (arr[i].getAge() < arr[j].getAge()) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } list(); } /** * 3、选择排序,按年纪从小到大排列 * * 核心思想:把第一个元素当作最小的,依次与其后面的元素比较,如果有比其小的,就赋值给他 * 最后在外循环进行数据替换 */ public void selectSort2() { int min = 0; Person temp; for (int i = 0; i < len - 1; i++) { min = i; for (int j = i + 1; j < len; j++) { if (arr[j].getAge() < arr[min].getAge()) { min = j; } } temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } list(); } /** * 4、使用插入排序 * * 思想:插入排序法的排序思想就是从数组的第二个元素开始,将数组中的每一个元素按照规则插入到已排好序的数组中以达到排序的目的. * 一般情况下将数组的第一个元素作为启始元素,从第二个元素开始依次插入.由于要插入到的数组是已经排好序的, * 所以只是要从右向左找到比插入点(下面程序中的select)小(对升序而言)的第一个数组元素就插入到其后面. * 直到将最后一个数组元素插入到数组中,整个排序过程就算完成. */ public void insertSort() { Person select; // 从第二个元素开始抽取与前面的每个比较 for (int i = 1; i < len; i++) { select = arr[i]; int j; // 与i前面的元素比较,只有前面的元素大于被抽取的元素才替换 for (j = i; j > 0 && arr[j - 1].getAge() >= select.getAge(); j--) { // 元素向右移动,就是把j-1位置上的元素移动到j的位置上 arr[j] = arr[j - 1];// 把大的与晓得替换位置 } //为什么这里是把select赋给arr[j]呢?比如数组[2,1,3,4,0] //分析:i = 1时 ,0(j-1)位置上的元素>i位置上的元素,2移动到了1位置,此时j--,相当于j = 0;select上是i=1时的数据 //也就是说把i=1时的数据移动到了i=0的位子上 arr[j] = select; } list(); } public static void main(String[] args) { PersonArray demo = new PersonArray(20); for (int i = 0; i < 10; i++) { demo.init(new Person("tom"+i, 20+i, i % 2 == 0 ? "女" : "男")); } demo.list(); System.out.println("------------------插入后-----------------------------"); demo.insert(new Person("jack",80,"男")); demo.list(); System.out.println("------------------搜索后-----------------------------"); System.out.println("result1 = " + demo.search("tom1")); System.out.println("------------------二分查找搜索后-----------------------------"); System.out.println("result2 = " + demo.binarySearch("jack")); System.out.println("------------------删除后-----------------------------"); demo.delete("tom2"); System.out.println("------------------编辑后-----------------------------"); demo.edit("tom3",new Person("kity", 55, "男")); System.out.println("------------------排序后-----------------------------"); demo.bubbleSort(); System.out.println("------------------选择排序后1-----------------------------"); demo.selectSort(); System.out.println("------------------选择排序后2-----------------------------"); demo.selectSort2(); System.out.println("------------------插入排序-----------------------------"); long start = System.currentTimeMillis(); demo.insertSort(); long end = System.currentTimeMillis(); System.out.println("time==" + (end - start)); }}

转载地址:https://lovoo.blog.csdn.net/article/details/51589930 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java 数据结构之栈的基本实现
下一篇:Java 数据结构之数组的操作二:数据插入与二分查找法

发表评论

最新留言

不错!
[***.144.177.141]2024年04月06日 07时51分00秒