排序算法 java实现2

继续排序算法

4.冒泡排序

从第一个开始,跟后面一个数比较,如果比后面大就交换位置,这样没完成一轮,就可以把最大的选出来

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

改进上面的冒泡排序

方案一:设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,

故在进行下一趟排序时只要扫描到pos位置即可

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

改进方案二:

两边同时进行  先找最大的  然后找最小的

    public static <T extends Comparable<T>> T[] genericBubbleSortGai2(T[] a) {
        int n = a.length;
        int low = 0, high = n - 1;
        int j;
        T tmp;
        while (low < high) {
            for (j = low; j < high; j++) {
                if (a[j].compareTo(a[j + 1]) > 0) {
                    tmp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = tmp;
                }
            }
            high--;
            for (j = high; j > low; j--) {
                if (a[j].compareTo(a[j - 1]) < 0) {
                    tmp = a[j];
                    a[j] = a[j - 1];
                    a[j - 1] = tmp;
                }
            }
            low++;
        }
        return a;
    }

改进方案三:

设置一个标志  如果有一趟没有发生交换  则排序完成

    public static <T extends Comparable<T>> T[] genericbubblesortgai3(T[] a) {
        int n = a.length;
        boolean flag = true;
        for (int i = 0; i < n - 1; i++) {
            if (!flag) {
                return a;
            }
            flag = false;
            for (int j = 0; j < n - i - 1; j++) {
                if (a[j].compareTo(a[j + 1]) > 0) {
                    flag = true;
                    T temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }

        }
        return a;
    }

5.快速排序

<快速排序> 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
* 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序是一种不稳定的排序算法

    public static <T extends Comparable<T>> T[] QuickSortStart(T[] list) {
        quickSort(list, 0, list.length - 1);
        return list;
    }

    private static <T extends Comparable<T>> void quickSort(T[] list,
            int first, int last) {
        if (last > first) {
            int povitIndex = partition(list, first, last);
            quickSort(list, first, povitIndex - 1);
            quickSort(list, povitIndex + 1, last);
        }
    }

    private static <T extends Comparable<T>> int partition(T[] list, int first,
            int last) {
        /*
         * 把数组分为两组,将比povit小的数放在它前面,比povit大的数放在它后面
         */
        T povit = list[first];
        int low = first + 1;
        int high = last;

        while (high > low) {
            while (high > low && list[low].compareTo(povit) <= 0)
                low++;
            while (low <= high && list[high].compareTo(povit) > 0)
                high--;
            if (high > low) {
                T temp = list[high];
                list[high] = list[low];
                list[low] = temp;
            }
        }
        while (high > first && list[high].compareTo(povit) >= 0)
            high--;
        if (povit.compareTo(list[high]) > 0) {
            list[first] = list[high];
            list[high] = povit;
            return high;
        }
        return first;
    }

6.归并排序

将一个序列一直对半拆分,知道不能拆分,然后开始归并,归并采用插入排序

    public static <T extends Comparable<T>> T[] mergesort(T[] a) {
        T[] temp = a.clone();
        a = msort(a, temp, 0, a.length);
        return a;
    }

    public static <T extends Comparable<T>> T[] msort(T[] a, T[] temp,
            int first, int last) {
        if (first + 1 < last) {
            int mid = (first + last) / 2;
            msort(a, temp, first, mid);
            msort(a, temp, mid, last);

            int index1 = first;
            int index2 = mid;
            int index3 = first;
            while (index1 < mid && index2 < last) {
                if (a[index1].compareTo(a[index2]) < 0) {
                    temp[index3] = a[index1];
                    index1++;
                } else {
                    temp[index3] = a[index2];
                    index2++;
                }
                index3++;
            }
            while (index1 < mid) {
                temp[index3++] = a[index1++];
            }
            while (index2 < last) {
                temp[index3++] = a[index2++];
            }
            for (int i = first; i < last; i++)
                a[i] = temp[i];

        }
        return a;
    }

感觉就是把代码复制上去了,说的不是很清楚,,,还有一个堆排序没有写

最后对上面的排序算法做了下测试,生成10000个int数,进行排序,算时间

1.归并排序  50~60 ms之间

2.简单选择排序 135~155 ms之间

3.选择排序 220 ms    //可能是我数据没选好,10000个数,生成的随机数也是0~10000

4.快速排序  30ms  左右

5.冒泡排序 改进方案二快点  280ms

6.插入排序  70ms左右

然后还是10000个随机数,范围换成0~100000,结果基本每种排序的时间更短

所以排序的时间长短是和数据本身有关系的

时间: 2024-10-13 01:16:44

排序算法 java实现2的相关文章

排序算法Java实现

排序算法Java实现 排序算法的分类: 内部排序,在排序过程中,全部记录放在内存中,称为内部排序: 外部排序,在排序过程中需要使用外部存储(磁盘),则称为外部排序. 主要介绍内部排序: 插入排序:直接插入排序.二分法插入排序.希尔排序 选择排序:简单选择排序.堆排序 交换排序:冒泡排序.快速排序 归并排序 基数排序 插入排序 直接插入排序 基本思想:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列.接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的

经典排序算法(Java实现)

以下程序均将数据封装于DataWrap数据包装类中,如下所示: 1 //数据包装类 2 class DataWrap implements Comparable<DataWrap> 3 { 4 int data; 5 String flag; 6 public DataWrap(int data,String flag) 7 { 8 this.data = data; 9 this.flag = flag; 10 } 11 //重写compareTo方法 12 public int compa

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

八大排序算法JAVA实现(时间复杂度O(n*logn)篇)

本文讲述时间复杂度为n*logn的排序算法:归并排序.快速排序.堆排序以及希尔排序的原理.Java实现以及变形应用. 一.归并排序 原理:把两个有序数列合并为一个有序数列.需递归实现. Java实现: 1 public int[] mergeSort(int[] a, int n) 2 { 3 return doMergeSort(a, n, 0, n - 1); 4 } 5 public int[] doMergeSort(int[] a, int n, int start, int end)

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

八大排序算法Java(转)

目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择排序堆排序Heap Sort 交换排序冒泡排序Bubble Sort 交换排序快速排序Quick Sort 归并排序Merge Sort 桶排序基数排序Radix Sort 总结 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序

排序系列 之 希尔排序算法 —— Java实现

基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序. 因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高. 实例: 无序序列:int a[] = {3,1,5,7,2,4,9,6}; 第一趟时: n=8; gap=n/2=4; 把整个序列共分成了4个子序列{3,

排序算法 java实现

几个排序算法,我是按照算法的伪代码用java实现的,刚开始是int类型的,后来换成泛型. 这是好早之前写的代码了,现在那出来温习下,就当是准备面试把 1.简单选择排序 这个算法应该是最简单的把,就是在数组中从头开始循环,选择最小的放在最前面,这个应该很好实现就不废话了 public static <T extends Comparable<T>> T[] genericsimpleselectionsort(T[] a){ for (int i = 0; i < a.leng

Java排序算法-Java入门|Java基础课程

Java 排序算法 1. 课程目标 排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2.适用对象 Java语言初学者 Java算法爱好者 3.相关概念 3.1 排序概念 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 3.2 排序算法 排序算法,就是如何使得记录按照要求排列的方法. 排序算法在很多领域得到相当地重视,尤其是在