插入排序,希尔排序,堆排序,归并排序,快速排序Java实现

参看:数据结构与算法分析-c语言描述

public class Main {

    public static void main(String[] args) {
        String[] a = { "a", "d", "e", "f", "m" };
        String[] b = { "a", "h", "g", "l", "z" };
        String[] c = { "z", "d", "a", "h", "z", "a", "d", "e", "f", "m" };//

        quickSort(c, 0, 9);

        for (int i = 0; i < c.length; i++) {
            System.out.println(c[i]);
        }

    }

    public static int[] testttt() {
        return new int[10];
    }

    public static <T extends Comparable<T>> void insertSort(T[] a) {
        if (a.length < 0)
            return;
        for (int i = 1; i < a.length; i++) {
            T temp = a[i];
            int j = i - 1;
            for (; j >= 0 && a[j].compareTo(a[i]) > 0; j--) {
                a[j + 1] = a[j];
            }
            a[j + 1] = temp;
        }
    }

    public static <T extends Comparable<T>> void shellSort(T[] a) {
        if (a.length < 0)
            return;
        for (int gap = a.length / 2; gap > 0; gap /= 2) {
            for (int i = gap; i < a.length; i++) {
                int j = gap;
                T temp = a[j];
                for (; j > 0 && temp.compareTo(a[j - gap]) < 0; j -= gap) {
                    a[j] = a[j - gap];
                }
                a[j] = temp;
            }

        }
    }

    private static int leftChild(int i) {
        return 2 * i + 1;
    }

    public static <T extends Comparable<T>> void perChange(T[] array, int i,
            int n) {// 从i位置开始,到n,进行交换找到最大元素
        int child;
        T temp = array[i];
        for (; leftChild(i) < n; i = child) {
            child = leftChild(i);
            if (child != n - 1 && array[child].compareTo(array[child + 1]) < 0)
                child++;
            if (temp.compareTo(array[child]) < 0)
                array[i] = array[child];
            else
                break;
        }
        array[i] = temp;

    }

    public static <T extends Comparable<T>> void heapSort(T[] array) {

        for (int i = array.length / 2; i > 0; i--) {
            perChange(array, i, array.length);
        }
        for (int i = array.length - 1; i > 0; i--) {
            T temp = array[0];
            array[0] = array[i];
            array[i] = temp;
            perChange(array, 0, i);
        }

    }

    public static String[] merge(String[] a, String[] b) {
        int aLength = a.length;
        int bLength = b.length;
        String[] temp = new String[aLength + bLength];
        int i, j, k;
        for (i = 0, j = 0, k = 0; i < aLength && j < bLength;) {
            if (a[i].compareTo(b[j]) > 0) {
                temp[k] = b[j];
                j++;
                k++;
            } else {
                temp[k] = a[i];
                i++;
                k++;
            }

        }
        if (i == aLength) {
            for (; j < bLength; j++, k++) {
                temp[k] = b[j];
            }
        } else {
            for (; i < aLength; i++, k++) {
                temp[k] = a[i];
            }
        }
        return temp;

    }

    public static void mergeSort(String[] a, int left, int right) {
        if (left < right) {
            int middle = (left + right) / 2;
            mergeSort(a, left, middle);
            mergeSort(a, middle + 1, right);
            merge(a, left, right, middle);
        }

    }

    public static void merge(String[] a, int left, int right, int middle) {

        String[] temp = new String[a.length];
        int i, j, k;
        for (i = left, j = middle + 1, k = 0; i <= middle && j <= right;) {

            if (a[i].compareTo(a[j]) > 0) {

                temp[k] = a[j];
                j++;
                k++;
            } else {
                temp[k] = a[i];
                i++;
                k++;
            }

        }
        if (i == middle + 1) {
            for (; j <= right; j++, k++) {
                temp[k] = a[j];
            }
        } else {
            for (; i <= middle; i++, k++) {
                temp[k] = a[i];
            }
        }
        for (int i1 = left, k2 = 0; i1 <= right; i1++, k2++) {
            a[i1] = temp[k2];
        }

    }

    public static void quickSort(String[] a, int left, int right) {

        if (left < right) {
            int p = partion(a, left, right);
            quickSort(a, left, p - 1);
            quickSort(a, p + 1, right);
        }

    }

    private static int partion(String[] a, int left, int right) {
        String temp = a[left];
        while (left < right) {
            while (left < right && a[right].compareTo(temp) >=0){
                right--;
            }
            a[left] = a[right];
            while (left < right && a[left].compareTo(temp) <=0){
                left++;
            }
            a[right] = a[left];

        }
        a[left] = temp;
        return left;
    }
}

插入排序,希尔排序,堆排序,归并排序,快速排序Java实现

时间: 2024-10-10 19:49:14

插入排序,希尔排序,堆排序,归并排序,快速排序Java实现的相关文章

希尔排序 堆排序 归并排序

希尔排序(by Donald Shell): 假定给了一个需要排序的数组并且 按照5-间隔的方式进行排序 附图如下 我们  慢慢的按照 越来越小的间隔开始去排序      (最后只能是间隔为1). 堆排序: 先回顾一下插入排序 void Selection_Sort ( ElementType A[], int N ) { for ( i = 0; i < N; i ++ ) { MinPosition = ScanForMin( A, i, N–1 ); //对应的也是一个for循环 没有最好

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

插入排序) 希尔排序 (最小增量排序)

/** * (插入排序) 希尔排序 (最小增量排序) * @author Cinn * */public class shellSort { /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] array= {48,58,50,98,69,51,27,99,100};        shlees

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

一下是一些常见的排序算法: 交换元素(后面算法都有用到): // 交换元素 private static void swap(int[] a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } 冒泡排序(有优化): // 冒泡排序(优化①,②,③,④) private static void bubbleSort(int[] a) { boolean flag = false;// ①表示整个序列是无序的 for

野生前端的数据结构练习(10)希尔排序,归并排序,快速排序

一.希尔排序 shell sort也称缩小增量排序,是对插入排序算法的改进,其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成.在较大的数据集上,希尔排序对于插排的优化效果是非常明显的. ./** * 希尔排序示例代码 */ function shellSort(gaps, arr) { for(let g = 0; g < gaps.length; g++){ let h

php实现的冒泡,插入排序,希尔排序,归并排序

<?php/***选择排序也就是冒泡排序,就是基于各个数据之间的对比来排序**/$arr = array(2,1,7,5,8,9,3,4,10,30,28,24);function bubbleSort($arr) {    $len = count($arr);    $k = 0;    for($i=0;$i<$len;$i++){    $k++;        for($j=$i+1;$j<$len;$j++) {            if($arr[$i] > $ar

插入排序—希尔排序(Shell`s Sort)原理以及Java实现

希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序. 操作方法: 选择一个增量序列t1,t2,-,tk,其中ti>tj,tk=1: 按增量序列个数k,对序列进行k 趟排序: 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序.仅增量因子为

排序算法之快速排序Java实现

排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:http://t.cn/hros0W  快速排序:http://t.cn/ScTA1d  归并排序:http://t.cn/Sc1cGZ 快速排序是一个就地排序,分而治之,大规模递归的算法.从本质上来说,它是归并排序的就地版本. 1.快速排序可以由下面四步组成:(1) 如果不多于1个数据,直接返回.(2

在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序

独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同. 归并排序涉及到递归的使用,需要理解其中精髓才能更好了解归并排序,以及其他应用到递归的算法.理解其本质才能更好的应用. 希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于195