插入排序


直接插入排序:

    当插入第i个数据元素k时,由前i-1个数据元素组成已排序的数据序列,将k与数据序列中各数据元素依次进行比较后,插入到数据序列的适当位置,使得插入后的数据序列仍是排序的。

    直接插入排序算法是稳定的,时间复杂度为O(n^2)。

 /*
* 插入排序
* 1.外层循环(循环控制变量i)的迭代是为了获取已排好序的子数列
* 2.内层循环(循环控制变量k)将list[i]插入到从list[0]到list[i-1]的子数列中
*/
public static void insertionSort(int[] array) {
for (int i = 1; i < array.length; i++) {
int minValue = array[i];
int k;
for (k = i - 1;k >= 0 && minValue < array[k]; k--) {
array[k + 1] = array[k];
}
array[k + 1] = minValue;
}
}

希尔排序:

    排序之初,允许数据元素做较大的移动,而当数据元素接近目的地时,再做较小的移动。这样做可使排序过程加快。希尔排序的算法思想非常简单,但如何选择增量以产生最好的排序效果,至今仍没定论。

    希尔排序算法是不定的,所需的时间取决于每次排序时增量的个数和增量的取值,若增量的取值比较合理,希尔排序算法的时间复杂度约为O(n(log_2n)^2)。

交换排序


冒泡排序:

    将相邻的两个数据元素按关键字进行比较,如果反序,则交换。对于一个待排序的数据序列,经一趟排序后,最大值数据元素移到最后位置,其它值较大的数据元素也向最终位置移动,此过程称为一趟起泡。

    冒泡排序算法是稳定的,时间复杂度为O(n^2)。

快速排序:

    快速排序是目前平均性能较好的一种排序算法。

    在待排序的数据序列中任意选择一个值作为基准值,由序列的两端交替地向中间进行比较、交换,使得所有比基准值晓得元素都处于序列的左端,比基准值大的元素都处于序列的右端,这样序列就被划分成两个子序列。再对两个子序列分别进行同样的操作,直到子序列的长度为1时,则已排好序。每趟排序完,作为基准值的数据元素需要找到它在排好序的序列中的最终位置。

选择排序:

  设待排序的数据序列有n个元素,第1趟排序,比较n个元素,选择关键字最小的元素,将其交换到序列的第1个位置上;第2趟排序,在余下的n-1个元素中,再选取关键字最小的元素,交换到序列的第2个位置上.....经过n-1趟排序,n个元素的数据序列则按递增次序排序完成。

  直接选择排序算法是不稳定的

 /*
* 选择排序
* 1.选择排序法先找到数列中最小的数
* 2.然后将它放在数列的最前面
* 3.在剩下的数中,循环1、2操作
*/
public static void selectionSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
int minValue = array[i];
int minIndex = i;
for (int j = i + 1;j < array.length;j++) {
if (array[j] < minValue) {
minValue = array[j];
minIndex = j;
}
}
if (minIndex != i) {
array[minIndex] = array[i];
array[i] = minValue;
}
}
}

归并排序: 

  归并排序算法可以递归地描述为:算法将数组分为两半,对每部分递归地应用归并排序。在两部分都排好序后,对它们进行归并。

  递归调用持续将数组划分为子数组,直到每个子数组只包含一个元素。然后,该算法将这些小的子数组归并为稍大的有序子数组,直到最后形成一个有序的数组。

 /**
* @author zhengbinMac
*/
public class mergeSort { public static void main(String[] args) {
int[] list = {2, 3, 2, 5, 6, 1, -2, 3, 14, 12};
mergeSort(list);
for (int i = 0; i < list.length; i++) {
System.out.print(list[i]+" ");
}
} public static void mergeSort(int[] list) {
if(list.length > 1) {
// 拆分过程
// 第一半儿
int[] firstHalf = new int[list.length / 2];
System.arraycopy(list, 0, firstHalf, 0, list.length / 2);
// 将这一半儿再拆成两半儿
mergeSort(firstHalf); // 第二半儿
int secondHalfLength = list.length - list.length / 2;
int[] secondHalf = new int[secondHalfLength];
System.arraycopy(list, list.length / 2, secondHalf, 0, secondHalfLength);
// 将这一半儿再拆成两半儿
mergeSort(secondHalf); // 将两半儿数组归并成一个新的有序数组temp
int[] temp = merge(firstHalf, secondHalf);
// 将temp赋给原始数组list
System.arraycopy(temp, 0, list, 0, temp.length);
}
} private static int[] merge(int[] list1, int[] list2) {
// 将拆分出来的两个数组归并为排好序的一个数组
int[] temp = new int[list1.length + list2.length];
int current1 = 0; // 指向list1当前考虑的元素
int current2 = 0; // 指向list2当前考虑的元素
int current3 = 0; // 指向temp当前考虑的元素 while(current1 < list1.length && current2 < list2.length) {
if(list1[current1] < list2[current2]) {
// 如果较小的元素在list1中,current1增加1
temp[current3++] = list1[current1++];
}else {
// 如果较小的元素在list2中,current2增加1
temp[current3++] = list2[current2++];
}
}
// 如果list1和list2中仍有未移动的元素,就将它们复制到temp中
while(current1 < list1.length) {
temp[current3++] = list1[current1++];
}
while(current2 < list2.length) {
temp[current3++] = list2[current2++];
}
// 将temp作为一个新的有序数组返回
return temp;
}
}
 package One;

 public class Test_sort {

     public static void main(String[] args) {
int[] a = { 2, 9, 5, 4, 8, 1 };
// sort(bubble_sort);
quick_sort(a, 0, a.length - 1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
} // 冒泡排序
public static int[] bubble_sort(int[] a) {
// 设置判断,进行优化
// 如果某次遍历中没有发生交换,那么就不用再进行下去,因为排序已完成
boolean ac = true;
for (int k = 1; k < a.length & ac; k++) {
ac = false;
for (int i = 0; i < a.length - 1; i++) {
if (a[i] > a[i + 1]) {
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
ac = true;
}
}
}
return a;
} // 快速排序
public static int[] quick_sort(int s[], int l, int r) {
if (l < r) {
// Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, x = s[l];
while (i < j) {
// 从右向左找第一个小于x的数
while (i < j && s[j] >= x)
j--;
if (i < j)
s[i++] = s[j]; // 从左向右找第一个大于等于x的数
while (i < j && s[i] < x)
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用 从右至左
quick_sort(s, i + 1, r); // 从左至右
}
return s;
}
}

一天一个Java基础——排序的更多相关文章

  1. java 基础排序(冒泡、插入、选择、快速)算法回顾

    java 基础排序(冒泡.插入.选择.快速)算法回顾 冒泡排序 private static void bubbleSort(int[] array) { int temp; for (int i = ...

  2. 一天一个Java基础——泛型

    这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲 ...

  3. 一天一个Java基础——数组

    一天一个变成了几天一个,最近接受的新东西太多.太快,有好多需要blog的但没有时间,这些基础知识应该是要深挖并好好研究的,不应该每次都草草了事,只看个皮毛. 数组: JVM将数组存储在一个称为堆(he ...

  4. 一个Java基础练习

    今天在群里又有一个朋友问到了这样一个练习,我索性将代码贴到这里,下次须要的朋友能够来这里看. 用到知识点:数组.集合.IO流 问题描写叙述:在例如以下图所看到的的一个txt文件里读取数据到内存,然后统 ...

  5. 一天一个Java基础——通过异常处理错误

    <Thinking in Java>上对这章的讲解不少,可见重要性,学习和总结一些主要的记录下来. 一.创建自定义异常 package Exception; class SimpleExc ...

  6. 一天一个Java基础——对象和类

    1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...

  7. 一天一个Java基础——序列化

    1.概念 Java的“对象序列化”能将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,能把这些byte数据恢复出来,并据此重新构建那个对象. 对象序列化能实 ...

  8. 一天一个Java基础——反射

    1.概念 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力 Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以运行时装配,无须在组件之间进行链接 反射允许在编写与执行 ...

  9. java 基础排序算法

    冒泡: 从左往右依次比较相邻的两个数,将小数放在前面,大数放在后面. public void bobSort(){        for(int i=0;i<length-1;i++){//排序 ...

随机推荐

  1. c++中new和delete的使用方法

    c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间 ...

  2. unity与Android相互调用

    原地址:http://www.cnblogs.com/ayanmw/p/3727782.html 现在unity 导出的android客户端需要调用 Android 的支付SDK,但是unity与an ...

  3. C# foreach循环绑定key数组和value 数组(备用)

    <div class="ContextualTab inner_warp clearfix" data-max="2" data-blur=false d ...

  4. POJ2418Hardwood Species

    题意 : 输入若干个树木品种,里边有的是重复的,让你统计每个品种占输入的总数量的百分比,最后按字典序输出 思路 : 本题数量很大,所以采用直接统计的方式会超时,而采用的方法可以用二叉搜索树,或者用ma ...

  5. C# 中的命名规则

    需要注意: C# 区分大小写 ,若有int a 和 int A ,则a, 和 A是不同的 普通字段,属相,方法,类的命名规则: C#中推荐使用  camelCasing ,和 PascalCasing ...

  6. lintcode:Find the Connected Component in the Undirected Graph 找出无向图汇总的相连要素

    题目: 找出无向图汇总的相连要素 请找出无向图中相连要素的个数. 图中的每个节点包含其邻居的 1 个标签和 1 个列表.(一个无向图的相连节点(或节点)是一个子图,其中任意两个顶点通过路径相连,且不与 ...

  7. lintcode:1-10题

    难度系数排序,容易题1-10题: Cosine Similarity new  Fizz Buzz  O(1)检测2的幂次  x的平方根  不同的路径  不同的路径 II  两个字符串是变位词  两个 ...

  8. 【mongoDB中级篇②】索引与expain

    索引的操作 数据库百分之八十的工作基本上都是查询,而索引能帮我们更快的查询到想要的数据.但是其降低了数据的写入速度,所以要权衡常用的查询字段,不必在太多字段上建立索引. 在mongoDB中默认是用bt ...

  9. Orcle数据库查询练习复习:四

    一.题目 1.找出张三的最高分和最低分以及对应的课程名 select * from course c,mark m where c.cid=m.cid and sid =(select sid fro ...

  10. WCF入门(七)---自托管消费WCF服务

    费自托管WCF服务的整个过程,一步步地解释以及充足的编码和屏幕截图是非常有必要. 第1步:服务托管,现在我们需要实现的代理类客户端.创建代理的方式不同. 使用svcutil.exe,我们可以创建代理类 ...