`
zhangshixi
  • 浏览: 675580 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

简单排序

阅读更多

众所周知,JDK提供了java.util.Arrays工具类,能通过sort方法对基本类型的数据或者Java对象进行排序。

本文通过学习及使用三种简单排序算法(冒泡排序、选择排序、插入排序),实现对存储Java对象的数组进行排序。

以便使大家在学习简单排序算法的同时,又能对Arrays的排序实现有个更加感性的认知。

package com.zhangsx.sort;

import java.util.Comparator;

/**
 * 简单排序算法的实现。
 * 包括冒泡排序、选择排序和插入排序;可对对象数组按照指定的排序规则进行排序。
 * 
 * 数组中的对象必须提供可比较的功能。
 * 有以下两种方式为对象实现可比较功能:
 * 1.对象实现java.lang.Comparable接口,提供比较规则。
 * 2.提供一个实现了java.util.Comparator接口的比较器。
 * 
 * @version 1.00 2010-4-11
 * @since 1.5
 * @author ZhangShixi
 */
public class SimpleSort {
    private SimpleSort() {
    }
    /**
     * 冒泡排序。
     * 
     * 排序数组中的对象必须实现java.lang.Comparable接口,提供排序比较规则。
     * 否则,调用时会抛出运行时异常java.lang.ClassCastException。
     * 
     * 算法描述如下:
     * 外层循环控制未排序的数据项,从数组最后一项开始,向低位递减。
     * 内层循环控制数据项的比较和排序,从数组起始项开始,向高位递增。
     * 每次内层循环结束,即外层循环移动一次时,数组的右侧将多一项排好序的数据。
     * 
     * 1.从数组起始位置开始,比较数组前两项。
     * 2.如果第一项大于第二项,则交换这两项。
     * 3.数组下标下移一位,继续比较下两项数据的大小。
     * 4.当遇到排好序的数据项时,返回到数组首项,重新开始下一趟排序。
     * 
     * @param arrays 排序数组
     */
    @SuppressWarnings("unchecked")
    public static void bubbleSort(Object[] arrays) {
        if (arrays == null || arrays.length == 0) {
            return;
        }

        for (int out = arrays.length - 1; out > 0; out--) {
            for (int in = 0; in < out; in++) {
                if (((Comparable) arrays[in]).compareTo(arrays[in + 1]) > 0) {
                    swap(arrays, in, in + 1);
                }
            }
        }
    }

    /**
     * 冒泡排序。
     * 按提供的比较器的比较规则进行排序。
     * @param arrays 排序数组
     * @param compara 排序比较器
     */
    public static <T> void bubbleSort(T[] arrays, Comparator<? super T> compara) {
        if (arrays == null || arrays.length == 0) {
            return;
        }

        for (int out = arrays.length - 1; out > 0; out--) {
            for (int in = 0; in < out; in++) {
                if (compara.compare(arrays[in], arrays[in + 1]) > 0) {
                    swap(arrays, in, in + 1);
                }
            }
        }
    }

    /**
     * 选择排序。
     * 
     * 排序数组中的对象必须实现java.lang.Comparable接口,提供排序比较规则。
     * 否则,调用时会抛出运行时异常java.lang.ClassCastException。
     * 
     * 算法描述如下:
     * 外层循环控制未排序的数据项及交换最小数据项,从数组起始位置开始,向高位递增。
     * 内层循环控制查找最小数据项,从外层循环所指向的位置开始,向高位递增。
     * 每次内层循环结束,即外层循环移动一次时,数组的左侧将多一项排好序的数据。
     *
     * 1.外层循环从数组起始位置开始,并将最小数据项置为最小数据项。
     * 2.内层循环从外层循环指向的下一个数据项开始,分别与最小数据项进行比较。
     * 3.如果内层循环所指的当前数据项小于最小数据项,则将当前数据项下标置为最小数据项下标。
     * 4.循环比较,直至内层循环结束,将找到为排序部分的最小数据项的下标。
     * 5.交换外层循环当前数据项与内层循环找到的最小数据项。继续下一排序。
     * 
     * @param arrays 排序数组
     */
    @SuppressWarnings("unchecked")
    public static <T> void selectSort(Object[] arrays) {
        if (arrays == null || arrays.length == 0) {
            return;
        }

        int minIndex;
        for (int out = 0; out < arrays.length - 1; out++) {
            minIndex = out;

            for (int in = out + 1; in < arrays.length; in++) {
                if (((Comparable) arrays[minIndex]).compareTo(arrays[in]) > 0) {
                    minIndex = in;
                }
            }
            swap(arrays, out, minIndex);
        }
    }

    /**
     * 选择排序。
     * 按提供的比较器的比较规则进行排序。
     * @param arrays 排序数组
     * @param compara 排序比较器
     */
    public static <T> void selectSort(T[] arrays, Comparator<? super T> compara) {
        if (arrays == null || arrays.length == 0) {
            return;
        }

        int minIndex;
        for (int out = 0; out < arrays.length - 1; out++) {
            minIndex = out;

            for (int in = out + 1; in < arrays.length; in++) {
                if (compara.compare(arrays[minIndex], arrays[in]) > 0) {
                    minIndex = in;
                }
            }
            swap(arrays, out, minIndex);
        }
    }

    /**
     * 插入排序。
     * 
     * 排序数组中的对象必须实现java.lang.Comparable接口,提供排序比较规则。
     * 否则,调用时会抛出运行时异常java.lang.ClassCastException。
     * 
     * 算法描述如下:
     * 外层循环控制未排序的数据项及循环交换最小数据项,从数组起始位置开始,向高位递增。
     * 内层循环控制查找最小数据项,从外层循环所指向的位置开始,向高位递增。
     * 每次内层循环结束,即外层循环移动一次时,数组的左侧将多一项排好序的数据。
     * 
     * 1.外层循环从数组第二项开始,记录当前数据项及其下标。
     * 2.当数据项指向的数组下标大于0时,且当前数据项比其前一个数据项大时,交换这两项数据。
     * 3.数组下标指针减1,按条件2,循环比较前两项数据。
     * 4.当条件不满足时,跳出内层循环,并将外层循环的当前数据项赋予内层指针下标所指的数据项。
     * 5.外层循环递增,继续下一排序。
     * 
     * @param arrays 排序数组
     */
    @SuppressWarnings("unchecked")
    public static void insertSort(Object[] arrays) {
        if (arrays == null || arrays.length == 0) {
            return;
        }

        int in;
        for (int out = 1; out < arrays.length; out++) {
            Object temp = arrays[out];
            in = out;

            while (in > 0 && ((Comparable) arrays[in - 1]).compareTo(temp) > 0) {
                arrays[in] = arrays[in - 1];
                in--;
            }
            arrays[in] = temp;
        }
    }

    /**
     * 插入排序。
     * 按提供的比较器的比较规则进行排序。
     * @param arrays 排序数组
     * @param compara 排序比较器
     */
    public static <T> void insertSort(T[] arrays, Comparator<? super T> compara) {
        if (arrays == null || arrays.length == 0) {
            return;
        }

        int in;
        for (int out = 1; out < arrays.length; out++) {
            T temp = arrays[out];
            in = out;

            while (in > 0 && compara.compare(arrays[in - 1], temp) > 0) {
                arrays[in] = arrays[in - 1];
                in--;
            }
            arrays[in] = temp;
        }
    }

    /**
     * 交换指定数组中的指定下标的两个数据项。
     * @param first 第一个数据项的下标
     * @param second 第二个数据项的下标
     */
    private static void swap(Object[] arrays, int firstIndex, int secondIndex) {
        Object temp = arrays[firstIndex];
        arrays[firstIndex] = arrays[secondIndex];
        arrays[secondIndex] = temp;
    }
}

 

测试代码如下:

package com.zhangsx.sort;

import java.util.Comparator;
import java.util.Random;
import junit.framework.TestCase;

/**
 * 测试简单排序算法的实现。
 * @version 1.00 2010-4-11
 * @since 1.5
 * @author ZhangShixi
 */
public class SimpleSortTest extends TestCase {

    Person[] persons;
    Comparator<Person> comparator;

    @Override
    protected void setUp() throws Exception {
        persons = new Person[10];
        comparator = new PersonComparator();

        Person person;
        Random random = new Random();
        for (int count = 0; count < 10; count++) {
            int value = random.nextInt(100);
            person = new Person("name-" + value, value);
            persons[count] = person;
        }

        display();
    }

    @Override
    protected void tearDown() throws Exception {
        display();
    }

    /**
     * 测试冒泡排序算法的实现。
     */
    public void testBubbleSort() {
        SimpleSort.bubbleSort(persons, comparator);
        display();
        SimpleSort.bubbleSort(persons);
    }

    /**
     * 测试选择排序算法的实现。
     */
    public void testSelectSort() {
        SimpleSort.selectSort(persons);
        display();
        SimpleSort.selectSort(persons, comparator);
    }

    /**
     * 测试插入排序算法的实现。
     */
    public void testInsertSort() {
        SimpleSort.insertSort(persons);
        display();
        SimpleSort.insertSort(persons, comparator);
    }
    /**
     * 显示排序结果。
     */
    private void display() {
        for (Person person : persons) {
            System.out.println(person.toString());
        }
        System.out.println("-------------------");
    }
}

 

数组中的比较对象:实现Comparable接口,按年龄大小升序排序。

package com.zhangsx.sort;

/**
 * 人,排序对象。
 * @version 1.00 2010-4-11
 * @since 1.5
 * @author ZhangShixi
 */
public class Person implements Comparable<Person> {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person: [" + this.age + "]";
    }

    public int compareTo(Person person) {
        if (this.age > person.getAge()) {
            return 1;
        } else if (this.age < person.getAge()) {
            return -1;
        } else {
            return 0;
        }
    }
}

 

自定义的对象比较器:按年龄大小降序排序。

package com.zhangsx.sort;

import java.util.Comparator;

/**
 * 自定义比较器。
 * @version 1.00 2010-4-11
 * @since 1.5
 * @author ZhangShixi
 */
public class PersonComparator implements Comparator<Person> {

    public int compare(Person person1, Person person2) {
        if (person1.getAge() > person2.getAge()) {
            return -1;
        } else if (person1.getAge() < person2.getAge()) {
            return 1;
        } else {
            return 0;
        }
    }
}

 

2
3
分享到:
评论

相关推荐

    简单排序算法简介

    ### 简单排序算法简介 #### 一、简单排序算法概述 在计算机科学领域,**排序算法**是一类非常基础且重要的算法。这类算法旨在将一组无序的数据按照特定的顺序进行排列。由于实际应用中往往需要处理大量的数据,...

    第四章 简单排序(C++)_PDF(2020.06.10).rar

    在本资源中,我们主要探讨的是C++编程语言中的简单排序算法。这些算法是计算机科学的基础,对于理解和解决编程问题,特别是在数据处理和优化效率方面至关重要。"NOIP"(全国青少年信息学奥林匹克竞赛)和"信奥"指的...

    1.10编程基础之简单排序(10题)--题目 有链接.pdf

    简单排序是编程基础中的一个重要环节,它包括了基本的排序算法,如选择排序、插入排序、冒泡排序等。以下是对“1.10编程基础之简单排序(10题)--题目 有链接.pdf”文件内容的详细知识点说明。 1. 排序算法概述: ...

    VB 排序 简单排序 文本框取数字排序 字符串取数字排序

    在这个主题中,我们将深入探讨VB中的简单排序算法,特别是如何处理文本框中的数字排序以及从字符串中提取数字进行排序。 1. **简单排序算法**: - **冒泡排序**:是最基础的排序方法,通过不断地比较相邻元素并...

    链表的简单排序

    链表的简单排序 链表是一种基本的数据结构,它由多个节点组成,每个节点都包含一个指向下一个节点的指针。今天,我们来讨论链表的简单排序。 链表的简单排序需要使用到链表的基本操作,包括链表的创建、遍历和排序...

    利用C++向量的简单排序

    利用C++向量的简单排序 本资源旨在介绍利用C++中的Vector实现简单排序的方法。该资源通过实例代码,详细地展示了如何使用Vector容器来存储整数,并使用选择排序算法对其进行排序。 知识点一:C++中的Vector容器 ...

    快速排序归并排序简单排序算法比较

    自己写的三个排序算法的比较。快速排序、归并排序、简单排序 对三个排序算法所消耗时间进行统计,比较时间效率 程序是在Linux下用C写的,vc下并未做测试。

    简单插入排序,实现简单排序方法

    c++实验之一:简单插入排序 实现简单排序方法

    Excel简单排序的例子.rar

    本例子以"26.4简单排序的例子.xls"为载体,展示了如何按照“科目名称”的笔划顺序进行升序排序。 首先,打开Excel工作簿,可以看到一个包含多个科目名称的数据表。这些科目可能是学校课程、公司部门或其他需要排序...

    西电数据结构第六次上机简单排序代码

    题目一 简单排序方法 【问题描述】 简单排序算法主要包括冒泡排序、简单选择排序和直接插入排序,它们都是时间复杂度为的排序方法,需要熟练掌握。 【基本要求】 用随机函数产生10000(或更多)个整数(或浮点数...

    简单排序法(C#)

    本项目“简单排序法(C#)”聚焦于三种基本的排序算法:冒泡排序、选择排序和插入排序,这些都是C#编程初学者必须掌握的基本技能。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,通过重复遍历待排序的元素列表...

    《Java数据结构和算法》学习笔记(2)——4种简单排序算法

    本文将深入探讨四种简单的排序算法:插入排序、冒泡排序、选择排序。这些算法虽然在复杂度上不如高级排序算法如快速排序或归并排序,但它们提供了基础的排序逻辑,有助于理解更复杂的算法思想。 首先,我们来详细...

    java数组与简单排序

    本主题将深入探讨“java数组与简单排序”,涵盖有序数组、线性查找和二分法查找等核心概念。 有序数组是指数组中的元素按照特定顺序排列,例如升序或降序。在处理有序数组时,我们可以利用其特性来优化查找和操作...

    1.认识复杂度和简单排序算法1

    本节我们将深入探讨时间复杂度、简单排序算法以及评估算法效率的方法。 时间复杂度是衡量算法运行时间与输入数据量之间的关系,通常用大O记法表示。常数操作,如赋值`int a = arr[i]`或基本算术运算`+-*/`、位运算...

    第四章 简单排序(C++)_codes(2020.06.04).rar

    在本压缩包文件"第四章 简单排序(C++)_codes(2020.06.04).rar"中,包含的是关于C++编程语言实现简单排序算法的相关代码。这些代码可能是为了帮助学习者理解并掌握基础的排序算法,特别是针对信息学竞赛(如信奥)和...

    各种简单排序

    ### 各种简单排序 #### 内容概览 本文主要介绍了几种常见的简单排序算法,包括冒泡排序、交换排序(通常指冒泡排序的一种变体)、选择排序以及插入排序。这些排序算法虽然效率不是最高,但它们的概念简单且易于...

    简单排序算法--类的简单使用

    在编程领域,排序算法是计算机科学中的基础概念,它用于对一组数据进行排列,以便于检索、分析或处理。在本主题中,我们将探讨如何使用C++类来实现不同的排序算法,并理解类在实现这些算法时的角色。我们将重点关注...

Global site tag (gtag.js) - Google Analytics