排序算法 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,结果基本每种排序的时间更短
所以排序的时间长短是和数据本身有关系的
排序算法 java实现2的更多相关文章
- 八大排序算法Java
		
目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...
 - 八大排序算法Java实现
		
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
 - 排序算法(Java实现)
		
这几天一直在看严蔚敏老师的那本<数据结构>那本书.之前第一次学懵懵逼逼,当再次看的时候,发觉写的是非常详细,非常的好. 那就把相关的排序算法用我熟悉的Java语言记录下来了.以下排序算法是 ...
 - 6种基础排序算法java源码+图文解析[面试宝典]
		
一.概述 作为一个合格的程序员,算法是必备技能,特此总结6大基础算法.java版强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步:1.思想2.图 ...
 - 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题
		
常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...
 - 九大排序算法Java实现
		
之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...
 - 排序系列 之 希尔排序算法 —— Java实现
		
基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本 ...
 - 十大基础排序算法[java源码+动静双图解析+性能分析]
		
一.概述 作为一个合格的程序员,算法是必备技能,特此总结十大基础排序算法.java版源码实现,强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步: ...
 - 排序算法Java代码实现(一)—— 选择排序
		
以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...
 - 【排序算法】希尔排序算法 Java实现
		
希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎 ...
 
随机推荐
- 对JAVA的集合的理解
			
对JAVA的集合的理解是相对于数组 1.数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) 2.JAVA集合可以存储和操作数目不固定的一组数据. 3.所有的JAVA集合都位 ...
 - ajax数据请求的理解
			
一,请求 发送请求有两种方式:get 跟 post . 1.get仅请求数据,不需要服务端做处理,最后会返回指定的资源. 2.post可以提交数据,服务端根据提交的数据做处理,再返回数据. 二,创建X ...
 - Linux 邮件服务搭建
			
Linux 邮件服务搭建 邮件服务针对,在大型企业使用的比较多,一般小型企业都会买一些邮件服务,或者使用一些免费的邮件服务,达到我们使用的需求,并且不需要自己维护,下面我就来简单安装一下两个邮箱的案例 ...
 - jq中ajax的dataType:"json"是指什么?
			
dataType String 预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如XML MIME类型就被识别为XML.在1.4中,JSON就 ...
 - PHP中的常见魔术方法功能作用及用法实例
			
概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发. 开始之前 在总结 ...
 - 二、linux题型
			
1.[root@pyrene ~]# 这里root是当前登录用户 @分割 pyrene是主机名 -:表示当前登录环境 #:表示管理员 2.在/data下面创建一个文件oldboy. ...
 - 2018.7.12训练赛 -G
			
第二道水题 前边说了很多话,但就最后两段有用. 就是给你一个序列,然后你判断一下这个序列是不是递增的,是就输出yes,否则输出no. 所以以后不管题目看起来多长.多复杂,都要读一遍. 代码就不贴了.
 - 互联网高并发之Hystrix实现服务隔离和降级
			
当大多数人在使用Tomcat时,多个HTTP服务会共享一个线程池,假设其中一个HTTP服务访问的数据库响应非常慢,这将造成服务响应时间延迟增加,大多数线程阻塞等待数据响应返回,导致整个Tomcat线程 ...
 - MySQL性能优化-内存参数配置
			
Mysql对于内存的使用,可以分为两类,一类是我们无法通过配置参数来配置的,如Mysql服务器运行.解析.查询以及内部管理所消耗的内存:另一类如缓冲池所用的内存等. Mysql内存参数的配置及重要,设 ...
 - QT 创建对话框 Dialog 实例
			
1. 2. dialog.h 头文件 #ifndef DIALOG_H #define DIALOG_H #include <QDialog> QT_BEGIN_NAMESPACE cla ...