本节内容是排序算法系列之一: 希尔排序 ,主要讲解了希尔排序的主体思路,选取了一个待排序的数字列表对希尔排序算法进行了演示,给出了希尔排序算法的 Java 代码实现,让粉丝们变的更强可以更好的理解希尔排序算法.
希尔排序(Shell Sort),是计算机科学与技术领域中较为简单的一种排序算法.
按照增量序列的个数 m,对整个待排序序列进行 m 趟排序.
每一趟排序,根据对应的增量 ki,需要将待排序的序列分成对应长度的子序列,分别在子序列上面进行直接插入排序.当且仅当增量序列为 1 时,整个序列作为一个整体处理.
从上面的示例可以看出,其实整个希尔排序的过程,就是根据增量大小依次进行插入排序,本质上还是针对插入排序的一种优化.
在说明希尔排序的整个过程之后,此时此刻呢,我们看看如何用 Java 代码实现希尔排序算法.
运行结果如下:
本节主要学习了希尔排序算法,通过本节课程的学习,需要熟悉希尔排序的算法流程,知道希尔排序算法的实现思路,可以自己用代码实现希尔排序算法.至此,我们已经学习了排序算法中的冒泡排序、插入排序、选择排序、希尔排序.
java常见的排序分为:
①. 插入类排序
主要就是对于一个已经有序的序列中,插入一个新的记录.它包括:直接插入排序,折半插入排序和希尔排序
这类排序的核心就是每次比较都要"交换",在每一趟排序都会两两发生一系列的"交换"排序,但是每一趟排序都会让一个记录排序到它的最终位置上.它包括:起泡排序,快速排序
每一趟排序都从一系列数据中选择一个最大或最小的记录,将它放置到第一个或最后一个为位置交换,只有在选择后才交换,比起交换类排序,减少了交换记录的时间.属于它的排序:简单选择排序,堆排序
将两个或两个以上的有序序列合并成一个新的序列
主要基于多个关键字排序的.
下面针对上面所述的算法,讲解一些常用的java代码写的算法
二 插入类排序之直接插入排序
直接插入排序,一般对于已经有序的队列排序效果好.
基本思想:每趟将一个待排序的关键字按照大小插入到已经排序好的位置上.
package sort.algorithm;
public class DirectInsertSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int temp, j;
for (int i = 1; i data.length; i++) {
temp = data[i];
j = i - 1;
// 每次比较都是对于已经有序的
while (j = 0 data[j] temp) {
data[j + 1] = data[j];
j--;
}
data[j + 1] = temp;
// 输出排序好的数据
for (int k = 0; k data.length; k++) {
System.out.print(data[k] + " ");
三 插入类排序之折半插入排序(二分法排序)
条件:在一个已经有序的队列中,插入一个新的元素
折半插入排序记录的比较次数与初始序列无关
思想:折半插入就是首先将队列中取最小位置low和最大位置high,然后算出中间位置mid
将中间位置mid与待插入的数据data进行比较,
如果mid大于data,则就表示插入的数据在mid的左边,high=mid-1;
如果mid小于data,则就表示插入的数据在mid的右边,low=mid+1
最后整体进行右移操作.
//折半插入排序
public class HalfInsertSort {
// 存放临时要插入的元素数据
int temp;
int low, mid, high;
// 在待插入排序的序号之前进行折半插入
low = 0;
high = i - 1;
while (low = high) {
if (temp data[mid])
high = mid - 1;
else
// low=high的时候也就是找到了要插入的位置,
// 此时进入循环中,将low加1,则就是要插入的位置了
low = mid + 1;
// 找到了要插入的位置,从该位置一直到插入数据的位置之间数据向后移动
for (int j = i; j = low + 1; j--)
data[j] = data[j - 1];
// low已经代表了要插入的位置了
data[low] = temp;
四 插入类排序之希尔排序
希尔排序,也叫缩小增量排序,目的就是尽可能的减少交换次数,每一个组内最后都是有序的.
将待续按照某一种规则分为几个子序列,不断缩小规则,最后用一个直接插入排序合成
public class ShellSort {
double d1 = a.length;
int temp = 0;
while (true)
{
//利用这个在将组内倍数减小
//d为增量每个分组之间索引的增量
int d = (int) d1;
//每个分组内部排序
for (int x = 0; x d; x++)
//组内利用直接插入排序
for (int i = x + d; i a.length; i += d) {
int j = i - d;
temp = a[i];
for (; j = 0 temp a[j]; j -= d) {
a[j + d] = a[j];
a[j + d] = temp;
if (d == 1)
break;
for (int i = 0; i a.length; i++)
System.out.print(a[i]+" ");
五 交换类排序之冒泡排序
交换类排序核心就是每次比较都要进行交换
冒泡排序:是一种交换排序
每一趟比较相邻的元素,较若大小不同则就会发生交换,每一趟排序都能将一个元素放到它最终的位置!每一趟就进行比较.
//冒泡排序:是一种交换排序
public class BubbleSort {
// 按照递增顺序排序
// 排序的比较趟数,每一趟都会将剩余最大数放在最后面
for (int i = 0; i data.length - 1; i++) {
// 每一趟从开始进行比较,将该元素与其余的元素进行比较
for (int j = 0; j data.length - 1; j++) {
if (data[j] data[j + 1]) {
temp = data[j];
data[j] = data[j + 1];
for (int i = 0; i data.length; i++)
System.out.print(data[i] + " ");
public?class?ShellSort?{?
//交换数组元素?
private?static?void?swap(int[]?a,?int?i,?int?j)?{?
int?t?=?a[i];?
a[i]?=?a[j];?
a[j]?=?t;?
}?
public?static?void?sort(int[]?a)?{?
int?h?=?1;?
while?(h?=?1)?{?
//将数组变为间隔h个元素有序?
for?(int?i?=?h;?i?a.length;?i++)?{?
//间隔h插入排序?
for?(int?j?=?i;?j?=?h?a[j]?a[j?-?h];?j?-=?h)?{?
swap(a,?j,?j?-?h);?
你看这个链接,网页链接
希望可以帮到你,望采纳~