继续排序算法

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的更多相关文章

  1. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

  2. 八大排序算法Java实现

    本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...

  3. 排序算法(Java实现)

    这几天一直在看严蔚敏老师的那本<数据结构>那本书.之前第一次学懵懵逼逼,当再次看的时候,发觉写的是非常详细,非常的好. 那就把相关的排序算法用我熟悉的Java语言记录下来了.以下排序算法是 ...

  4. 6种基础排序算法java源码+图文解析[面试宝典]

    一.概述 作为一个合格的程序员,算法是必备技能,特此总结6大基础算法.java版强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步:1.思想2.图 ...

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

    常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

  6. 九大排序算法Java实现

    之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...

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

    基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本 ...

  8. 十大基础排序算法[java源码+动静双图解析+性能分析]

    一.概述 作为一个合格的程序员,算法是必备技能,特此总结十大基础排序算法.java版源码实现,强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步: ...

  9. 排序算法Java代码实现(一)—— 选择排序

    以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...

  10. 【排序算法】希尔排序算法 Java实现

    希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎 ...

随机推荐

  1. Kattis - abc 【水】

    题意 给出三个数,然后给出一个顺序,有ABC三个字母构成, A是最大的数字 B是中间的数字 C是最小的数字 根据 ABC的顺序 给出 数字的顺序 思路 先排序一下,然后用 MAP 双向标记一下 AC代 ...

  2. C++中引用编译过的C代码为什么要用“extern c”

    函数经过编译系统的翻译成汇编,函数名对应着汇编标号.  因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main  但是C++中函数名与得到的汇编代号 ...

  3. ajax数据请求的理解

    一,请求 发送请求有两种方式:get 跟 post . 1.get仅请求数据,不需要服务端做处理,最后会返回指定的资源. 2.post可以提交数据,服务端根据提交的数据做处理,再返回数据. 二,创建X ...

  4. $Android AlarmManager的用法详解

    在Android的Alarm机制中,使用AlarmManager可以实现类似闹钟这样的定时任务.在毕业设计项目中要实现定时任务的功能,所以在这里先进行一下梳理. (一)AlarmManager与Bro ...

  5. jni 编译错误error: unknown type name '__va_list'

     platforms\android-9\arch-arm\usr\include\stdio.h:257:37: error: unknown type name '__va_list'     解 ...

  6. linux+java+webdriver chrome handless无界面启动

    网上现有的解决方案要么是windows下的,要么是python的,搞了一天终于解决了,记录如下. 1 下载chrome linux版和对应版本的webdriver,我这里使用的是chrome66和ch ...

  7. vRA7 Software Component

    将自定义Property传递给Software Component 示例: vRA7 支持 Software Components,并且还可以在用户的申请页面中,做一个下拉菜单,让用户选择需要安装的S ...

  8. linux-RabbitMQ安装命令

    一.RabbitMQ 1.安装配置epel源    $ rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.no ...

  9. Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】

    题目链接:http://codeforces.com/problemset/problem/938/E 题意: 定义f(a): 初始时f(a) = 0, M = 1. 枚举i = 2 to n,如果a ...

  10. MSDN 单机 MVC 帮助文档

    因为微软的mvc框架也是从开源框架演变而来的,所以微软没把mvc帮助文档放到单击帮助文档中.sososos下载好msdn单机帮助后,却找不到 System.Web.MVC 等命名空间的东西. 解决办法 ...