几大排序算法的Java实现(原创)

几大排序算法的Java实现

更新中...

注:

  1. 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流。
  2. 各个算法的思路都写在该类的注释中了,同时也方便各位进行本地环境验证。
  3. 目前已完成的排序算法有:冒泡排序、选择排序、插入排序。
  4. 暂时只提供这些排序算法的基本版,对算法的改进暂时不做考虑。
  5. 如果想看的更直观些,欢迎访问一个可视化的排序网站
import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class SortTest {

    /**
     * 用来存储给定范围内所有的整数
     */
    private static List<Integer> numList = new ArrayList<>();

    /**
     * 返回随机生成的[min, max)之间的整数数组
     * @param min 最小值
     * @param max 最大值(不包含)
     * @return
     */
    public static Integer[] generateRandomNum(int min, int max) {
        return generateRandomNum(min, max, (max - min));
    }

    /**
     * 返回随机生成的[min, max)之间的整数数组,个数为num个
     * @param min
     * @param max
     * @param num 要生成的随机数个数
     * @return
     */
    public static Integer[] generateRandomNum(int min, int max, int num) {
        long start = System.currentTimeMillis();
        List<Integer> result = new ArrayList<>();
        for (int i = min; i < max; i++) {
            numList.add(i);
        }
        for (int i = 0; i < num; i++) {
            result.add(generateOneNum(min, max));
        }
        long end = System.currentTimeMillis();
        System.out.println("生成的随机数组范围是:[" + min + ", " + max + "), 个数: " + num + ", 耗时: " + (end - start) / 1000.0 + "s.\n待排序数组为: " + result);

        return result.toArray(new Integer[]{});
    }

    // 读取numList中的任意元素
    private static int generateOneNum(int min, int max) {
        return (int) numList.remove((int) (Math.random() * numList.size()));
    }

    /**
     * 冒泡排序算法, 时间复杂度是O(n^2)
     * @throws Exception
     */
    @Test
    public void testBubbleSort() throws Exception {
//      Integer nums[] = { 67, 1, 69, 43, 7, 56, 34, 111, 87, 62, 89, 90, 31, 99, 100 };
        Integer[] nums = generateRandomNum(1, 100, 10);
        // 第一层for循环控制排序趟数。Reason: 1个数字->0趟排序,2个数字->1趟排序,3个数字->2趟排序
        for (int i = 0; i < nums.length - 1; i++) {
            // 第二层for循环控制本趟排序的比较过程
            for (int j = 0; j < nums.length - 1 - i; j++) {
                // 进行两两比较,如果后面的比前面小,则交换位置,则每进行一趟排序,最后一个数字都是该趟排序中最大的数字
                if (nums[j] > nums[j + 1]) {
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
            System.out.println("第" + (i + 1) + "趟排序结果为:" + Arrays.toString(nums));
        }
    }

    /**
     * 选择排序
     * @throws Exception
     */
    @Test
    public void testSelectionSort() throws Exception {
        Integer[] nums = generateRandomNum(1, 100, 10);
        for (int i = 0; i < nums.length - 1; i++) {// 仍旧是控制排序的趟数
            int minIndex = i;
            // 该层for循环就是为了找到最小的数字并和未排序的所有数字中的首位进行交换
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] < nums[minIndex]) {
                    minIndex = j;
                }
            }
            if (minIndex != i) {
                // 交换该趟排序中最小的数和未排序的数中首位数字
                int tmp = nums[minIndex];
                nums[minIndex] = nums[i];
                nums[i] = tmp;
            }
            System.out.println("第" + (i + 1) + "趟排序结果为: " + Arrays.toString(nums));
        }
    }

    /**
     * 插入排序: 到要插入的数,跟已经排好序的数做比对,如果该数小于之前的数,则之前的数向后移动一位,如果出现
     * 大于某个数,则在该位置插入数
     * @throws Exception
     */
    @Test
    public void testInsertSort() throws Exception {
        Integer[] nums = generateRandomNum(1, 100, 10);
        for (int i = 1; i < nums.length; i++) {// 第一层for循环解决趟数
            int j = i;
            int target = nums[i];// 获取要插入的那个数
            // 因为当插入的数比原本已排好序列中的数大时停止比较,所以采用while
            while (j > 0 && target < nums[j - 1]) {
                nums[j] = nums[j - 1];// j位置放j-1处的值,相当于该值后移一位
                j--;
            }
            // 结束while循环时target > nums[j - 1]
            nums[j] = target;

            System.out.println("第" + (i + 1) + "趟排序结果为: " + Arrays.toString(nums));
        }
    }

    /**
     * 快速排序
     * @throws Exception
     */
    @Test
    public void testQuickSort() throws Exception {
        Integer[] nums = generateRandomNum(1, 100, 10);
    }
    /**
     * 关于位运算: 1 ^ 正奇数 = 正奇数 - 1
     * @throws Exception
     */
    @Test
    public void testName() throws Exception {
        for (int i = 0; i < 101; i++) {
             System.out.println(1 ^ (2*i + 1));
        }
    }

}

原文地址:https://www.cnblogs.com/studentytj/p/9249841.html

时间: 2024-10-14 10:55:16

几大排序算法的Java实现(原创)的相关文章

几大排序算法的Java实现

很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向下沉,小数向上浮. package TestProject; /** * 冒泡排序 * @author xuhui * */ public class SortAll { public static void main(String[] args){ int[] a = {0,8,1,2,8,6,1

7种基本排序算法的Java实现

7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 1 /** 2 * 直接插入排序 3 * 不稳定 4 * 时间复杂度:O(n^2) 5 * 最差时间复杂度:O(n^2) 6 * 空间复杂度:O(1) 7 * 使用场景:大部分元素有序 8 * @param elements 9 * @param comparator 10 * @param <T> 11 */ 1

[转]各种排序算法及其java程序实现

原文:http://blog.csdn.net/t12x3456/article/details/7430700 各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort)1. 基本思想: 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止.2. 排序过程: 设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva

排序算法----快速排序java

快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class test02{ public static void main(String[] args) { int n = 1; while (n != 0){ Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); int s[] = ne

经典排序算法(Java版)

经典排序算法(Java版)  转载 1.冒泡排序 Bubble Sort最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡”序列处理若干遍.所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确.如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置.显然,处理一遍之后,“最轻”的元素就浮到了最高位置:处理二遍之后,“次轻”的元素就浮到了次高位

算法基础——经典八大排序算法的Java及Python实现

概述 八大排序算法不用多说了,程序员算法基础必须要掌握的,现在总结一下加深记忆.下图是这八大排序算法的分类.名称.时间空间复杂度,以及稳定性. 代码 以下是经典八大排序算法的Java及Python代码,都是基于经典算法书籍<算法导论>里的伪代码实现的,我在关键语句部分附上了注释. 按照上图中的顺序分别介绍八大排序算法的实现(升序),前面是Java,后面是Python.Java的排序函数写在了一个类里,Python的排序函数则直接写出来了. 直接插入排序 public class InsertS

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

排序算法(Java语言)——归并排序

归并排序mergesort中基本的操作是合并两个已排序的表.因为这两个表已排序,所以若将输出放到第三个表中,则该算法可以通过对输入数据一趟排序完成.基本的合并算法是取两个输入数组A和B,一个输出数组C,以及3个计数器Actr.Bctr.Cctr,他们初始置于对应数组的开始端.A[Actr]和B[Bctr]中的较小者被拷贝到C的下一个位置,相关的计数器向前推进一步.当两个输入表有一个用完的时候,则将另一个表中剩余部分拷贝到C中. 合并另个已排序的表的时间显然是线性的,因为最多进行N-1次比较,其中