这五种排序算法难度依次增加。

冒泡排序:

第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾。

第二次将数组的前n-1个元素取出,然后相邻两个元素依次比较,将大的元素往后移,最终n-1个元素中最大的元素又在末尾。

重复上面的步骤,直到数组只有1个元素为止。因为每次都将上一次比较剩下的最大元素放到末尾,所以当所有比较结束的时候,排序结束。

     public void bubbleSort(T[] array)
{
for(int i = array.length-1;i>0; i--)
{
for(int j = 0; j <i; j++)
{
if(array[j].compareTo(array[j+1]) > 0)
{
T temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}

二)选择排序

选择排序和冒泡排序类似,只是每次循环的时候将最大的元素位置记下来,然后当循环结束的时候,将最大的元素与最末尾元素进行调换。这样,当所有循环结束的时候,数组排序也结束。

     @Override
public void selectionSort(T[] array)
{
for(int i = array.length-1; i>0; i--)
{
int max = 0;
for(int j = 0; j <= i; j++)
{
if(array[max].compareTo(array[j]) < 0)
{
max = j;
}
} T temp = array[max];
array[max] = array[i];
array[i] = temp;
}
}

三)插入排序

插入排序的思想是遍历整个数组,从第一个元素开始,在遍历过程中将该元素与之前元素比较,将它插入到之前元素的中间,要求是该元素大于前面所有元素,且小于等于后面所有元素。

     @Override
public void insertionSort(T[] array)
{
this.insertionSort(array,0,array.length);
} @Override
public void insertionSort(T[] array, int start, int length)
{
for(int i = start; i < start+length;i++)
{
for(int j = start; j < i; j++)
{
if(array[i].compareTo(array[j]) < 0)
{
T temp = array[i];
for(int k = i; k > j; k--)
{
array[k] = array[k-1];
}
array[j] = temp;
}
}
}
}

四)希尔排序

希尔排序是插入排序的升级版。希尔排序会设置一个步长gap,然后不断减小gap,直到gap为1。而每次将数组中长度为gap的元素进行排序。其实就是先对数组进行局部排序,使得数组在总体上有序的,这样在插入排序的时候就不需要进行大规模的数据移动。

     @Override
public void shellSort(T[] array)
{
int gap = array.length/2;
while(gap >=1)
{
for(int i = gap; i<array.length; i++)
{
this.insertionSort(array, i-gap, gap+1);
}
gap = gap/2;
}
}

五)快速排序

快速排序会使用到分治法和递归思想。每次排序的时候,选取一个元素,将所有小于它的元素放到左边,将所有大于它的元素放到它的右边。然后将左边和右边的元素分别看成一个数组,然后递归将剩余的元素按照之前的方式排序。当数组长度为1的时候,递归结束,整个数组排序也完成。

     @Override
public void quickSort(T[] array)
{
this.quickSortInternal(array, 0, array.length-1);
} private void quickSortInternal(T[] array, int left, int right)
{
if(left >= right)
{
return;
} int _left = left;
int _right = right; boolean flag = false;
while(left!=right)
{
if(flag == false)
{
//从右向左逼近
if(array[right].compareTo(array[left]) < 0)
{
T temp = array[left];
array[left] = array[right];
array[right] = temp;
//交换后 应该调换方向
flag = !flag;
}
right--;
}
else
{
//从左向右逼近
if(array[left].compareTo(array[right]) > 0)
{
T temp = array[left];
array[left] = array[right];
array[right] = temp;
//交换后 应该调换方向
flag = !flag;
}
left++;
}
}
//递归
this.quickSortInternal(array, _left, left-1);
this.quickSortInternal(array, right+1, _right);
}
}

数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现的更多相关文章

  1. 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]

    关于冒泡排序,选择排序,插入排序,希尔排序[资料收集]  以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...

  2. 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现

    之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...

  3. 冒泡排序 选择排序 插入排序希尔排序 java

    双向冒泡 package com.huang; public class _014_bubb_sort { int[] b={1,2}; static int a[]={12,4,35,65,43,6 ...

  4. 内部排序->插入排序->希尔排序

    文字描述 希尔排序又称缩小增量排序,也属于插入排序类,但在时间效率上较之前的插入排序有较大的改进. 从之前的直接插入排序的分析得知,时间复杂度为n*n, 有如下两个特点: (1)如果待排序记录本身就是 ...

  5. 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现

    首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...

  6. 数据结构和算法(Golang实现)(22)排序算法-希尔排序

    希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...

  7. 排序算法--希尔排序(Shell Sort)_C#程序实现

    排序算法--希尔排序(Shell Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难 ...

  8. 《Algorithm算法》笔记:元素排序(2)——希尔排序

    <Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  9. C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)

    希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...

随机推荐

  1. EF Power Tools

    EF Power Tools可以从数据库反向生成实体及映射文件.一般在使用EF,有Database First,Code First以及Model First.常用的是Database First和C ...

  2. 006. C#使用WMI操作远程计算机

    1. 使用WMI CIM studio 查看\root\CIMV2 所有可使用的表/字段(类/属性) , 点击下载 WMI CIM studio 2. 安装完成后打开VMI CIM studio

  3. Oracle数据库——表的创建与管理

    一.涉及内容 1.掌握使用OEM工具创建.修改和删除表. 2.掌握使用SQL语句创建.修改和删除表. 3.掌握使用SQL语句插入.修改和删除数据. 4.理解各种约束的作用,并能够使用OEM工具和SQL ...

  4. ASP.NET GridView HyperLinkField传值和取值【转】

    来源:http://www.cnblogs.com/junjie94wan/archive/2011/08/17/2143623.html 经常做Winform程序,好久没有做WEB都有些生疏了,Gr ...

  5. hadoop-2.7.0

    65 cd /home/guyumei/下载/ 66 ll 67 cd .. 68 ll 69 cd .. 70 ll 71 cd guyumei/ 72 ll 73 cd hadoop-2.7.0/ ...

  6. MyBatis SQL xml处理小于号与大于号

    MyBatis SQL xml处理小于号与大于号 当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台 ...

  7. TP框架基础

    什么是TP框架: 一堆代码的集合,里边有变量.函数.类.常量,设计模式MVC.AR数据库.单例等等.全称是Tinkphp框架; 为什么使用框架: 使用框架将全部精力集中在业务层次,节省50-60%的工 ...

  8. WCF学习心得------(三)配置服务

    配置服务 配置服务概述 在设计和实现服务协定后,便可以进行服务的配置.在其中可以定义和自定义如何向客户段公开服务,包括指定可以找到服务的地址,服务用于发送和接受消息的传输和消息编码,以及服务需要的安全 ...

  9. mootools里选择器$,$$,$E,$ES等的区别

    区别就是 $和$$都是1个参数, $适用于ID,或者ID代表的对象 $$适用于CSS选择器 $E和$ES,有2个参数,第二个参数是可选参数代表(filter,即某个ID范围里的元素) $E('inpu ...

  10. 重绘Winform窗体

    本文转载自:http://www.cnblogs.com/encoding/p/5603080.html 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧). 还 ...