Java中的七种排序方式代码示例

package baseJava;

/**
 * @title SortMethods.java
 * @author DonsenChen
 * @Date 2018年5月2日 上午10:16:03
 * @Description
 */
public class SortMethods {
    public static void main(String[] args) {
        int[] arr = { 3, 7, 9, 1, 4, 8, 2, 6, 5 };
        binarySort(arr);
        bubbleSort(arr);
        quickSort(arr, 0, 0);
        selectSort(arr);
        insertSort(arr);
        shellSort(arr);
        mergeSort(arr, 0, 0);
    }

    // 1. 二分法排序
    public static void binarySort(int[] numbers) {
        int i, j, temp;
        int low, hight, mid;
        for (i = 1; i < numbers.length; i++) {
            temp = numbers[i];
            low = 0;
            hight = i - 1;
            while (low <= hight) {
                mid = (low + hight) / 2;
                if (numbers[mid] > temp)
                    hight = mid - 1;
                else
                    low = mid + 1;
            }
            for (j = i - 1; j > hight; j--)
                numbers[j + 1] = numbers[j];
            numbers[hight + 1] = temp;
        }
        System.out.print("二分法排序:");
        printArr(numbers);
        System.out.println();
    }

    // 2. 冒泡排序
    public static void bubbleSort(int[] numbers) {
        int temp; // 记录临时中间值
        int size = numbers.length; // 数组大小
        for (int i = 0; i < size - 1; i++) {
            for (int j = i + 1; j < size; j++) {
                if (numbers[i] > numbers[j]) { // 交换两数的位置(ps:这里的大于号小于号决定数组排序的升序或降序)
                    temp = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = temp;
                }
            }
        }
        System.out.print("冒泡排序:");
        printArr(numbers);
        System.out.println();
    }

    // 3. 快速排序
    public static void quickSort(int[] numbers, int start, int end) {
        if (start < end) {
            int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)
            int temp; // 记录临时中间值
            int i = start, j = end;
            do {
                while ((numbers[i] < base) && (i < end))
                    i++;
                while ((numbers[j] > base) && (j > start))
                    j--;
                if (i <= j) {
                    temp = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = temp;
                    i++;
                    j--;
                }
            } while (i <= j);
            if (start < j)
                quickSort(numbers, start, j);
            if (end > i)
                quickSort(numbers, i, end);
        }
        System.out.print("快速排序:");
        printArr(numbers);
        System.out.println();
    }

    // 4. 选择排序
    public static void selectSort(int[] numbers) {
        int size = numbers.length, temp;
        for (int i = 0; i < size; i++) {
            int k = i;
            for (int j = size - 1; j > i; j--) {
                if (numbers[j] < numbers[k])
                    k = j;
            }
            temp = numbers[i];
            numbers[i] = numbers[k];
            numbers[k] = temp;
        }
        System.out.print("选择排序:");
        printArr(numbers);
        System.out.println();
    }

    // 5. 插入排序
    public static void insertSort(int[] numbers) {
        int size = numbers.length, temp, j;
        for (int i = 1; i < size; i++) {
            temp = numbers[i];
            for (j = i; j > 0 && temp < numbers[j - 1]; j--)
                numbers[j] = numbers[j - 1];
            numbers[j] = temp;
        }
        System.out.print("插入排序:");
        printArr(numbers);
        System.out.println();
    }

    // 6. 希尔排序
    public static void shellSort(int[] numbers) {
        int n = numbers.length;
        // 进行分组,最开始的增量(gap)为数组长度的一半
        for (int gap = n / 2; gap > 0; gap /= 2) {
            // 对各个分组进行插入排序
            for (int i = gap; i < n; i++) {
                // 将art[i]插入到所在分组的正确位置上
                insertI(numbers, gap, i);
            }
        }
        System.out.print("希尔排序:");
        printArr(numbers);
        System.out.println();
    }

    // 希尔排序插入方法
    // 将art[i]插入到所在分组的正确位置上
    private static void insertI(int[] arr, int gap, int i) {
        int inserted = arr[i];
        int j;
        for (j = i - gap; j >= 0 && inserted < arr[j]; j -= gap) {
            arr[j + gap] = arr[j];
        }
        arr[j + gap] = inserted;
    }

    // 7. 归并排序
    public static void mergeSort(int[] numbers, int left, int right) {
        int t = 1;// 每组元素个数
        int size = right - left + 1;
        while (t < size) {
            int s = t;// 本次循环每组元素个数
            t = 2 * s;
            int i = left;
            while (i + (t - 1) < size) {
                merge(numbers, i, i + (s - 1), i + (t - 1));
                i += t;
            }
            if (i + (s - 1) < right)
                merge(numbers, i, i + (s - 1), right);
        }
        System.out.print("归并排序:");
        printArr(numbers);
        System.out.println();
    }

    // 归并算法实现
    private static void merge(int[] data, int p, int q, int r) {
        int[] B = new int[data.length];
        int s = p;
        int t = q + 1;
        int k = p;
        while (s <= q && t <= r) {
            if (data[s] <= data[t]) {
                B[k] = data[s];
                s++;
            } else {
                B[k] = data[t];
                t++;
            }
            k++;
        }
        if (s == q + 1)
            B[k++] = data[t++];
        else
            B[k++] = data[s++];
        for (int i = p; i <= r; i++)
            data[i] = B[i];
    }

    // 打印数组
    private static void printArr(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                System.out.print(arr[i] + "]");
            } else {
                System.out.print(arr[i] + ", ");
            }

        }
    }

}

***********************

心得之谈:欢迎指正,一起学习。

***********************

原文地址:https://www.cnblogs.com/donsenChen/p/8979250.html

时间: 2025-01-12 11:33:54

Java中的七种排序方式代码示例的相关文章

java中的List详解以及代码示例

一:概念List是Java集合Collection中的一个接口,一般用ArrayList类和LinkedList类去实现这个接口.Collection集合还有其他接口:Map,Set(在我的另一篇博客)二:LIST的使用List的常用方法 boolean add(E e) //尾插 e void add(int index, E element) //将 e 插入到 index 位置 boolean addAll(Collection<? extends E> c) //尾插 c 中的元素 E

Java中的几种排序方法

日常操作中常见的排序方法很多,比如有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 一.冒泡排序 一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 1 /** 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2 *对每一对相邻元

[Java]HashMap的两种排序方式

先将 Map 中的 key 和 value 全部取出来封装成 JavaBea 数组,再将这个数组排序,排序完成后,重新写回 Map 中,写回时采用 LinkedHashMap 可以保证迭代的顺序.下面的代码可以参考一下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

Java中的几种排序算法

插入排序:自1开始,通过交换将i插入其左端的有序的数列中. 交换次数不确定,但比较次数较均衡. 比冒泡更优. 1 private static void charu(int x[], int off, int len) { 2 for (int i = off; i < len + off; i++) 3 for (int j = i; j > off && x[j - 1] > x[j]; j--) 4 swap(x, j, j - 1); 5 } 选择排序:与冒泡相似

Java中的几种排序算法:冒泡排序,插入排序,二分法排序,简单排序,快速排序

冒泡排序: int[] hehe={4,7,2,5,6,9,0}; for(int i=0;i<hehe.length;i++){ for(int j=i+1;j<hehe.length;j++){ if(hehe[i]>hehe[j]){ int temp=hehe[i]; hehe[i]=hehe[j]; hehe[j]=temp; } } } 插入排序 int[] a={13,7,8,9,10,1,2,32}; int i,j,t,h; for (i=1;i<a.length

java中的四种单例实现方式

在java中,单例设计模式是非常常见的设计模式,对单例设计模式的概念,不做过多的介绍,下面将逐一介绍四种单例设计模式: 1.第一种单例设计模式 1.1 代码实现 package com.singleton.one; /**  * 第一种单例设计模式  * @author Administrator  *  */ public class SingleTonOne { // 实例化 private static SingleTonOne instance = new SingleTonOne();

模板化的七种排序算法,适用于T* vector&lt;T&gt;以及list&lt;T&gt;

最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板纯属于偷懒,更方便于测试代码的有效性,等代码写完也懒得去改了.下面开始介绍这段代码,有什么不对的地方欢迎前来指正. 一共写了七种排序,插入排序InsertSort.堆排序HeapSort.快速排序QuickSort.合并排序MergeSort,计数排序CountingSort,基数排序RadixSo

JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用)的作用.同时我们还将介绍ReferenceQueue和WeakHashMap的功能和使用示例. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. JAVA中的四种引用 四种引用中,软引用.若引用.虚引用都需要相关类来创建.创建的时候

Java单例模式的七种写法

Java单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 优缺点:这种写法lazy loading很明显,