一、 选择排序

    /**
* 选择排序: int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
*
* 第0趟
5 2 6 7 6 4 8
第1趟
2 5 6 6 4 7 8
第2趟
2 5 6 4 6 7 8
第3趟
2 5 4 6 6 7 8
第4趟
2 4 5 6 6 7 8
第5趟
2 4 5 6 6 7 8
第6趟
2 4 5 6 6 7 8
*/
public void selectSorted(int arr[]) { int n = arr.length;
for (int i = 0; i < n; i++) { for (int j = 0; j < n - 1; j++) { if (arr[j + 1] < arr[j])
swap(arr, j, j + 1);
}
System.out.println("\n" + "第" + i + "趟");
printArray(arr);
}
}

二、插入排序

    /**
* 插入排序 : int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
* 第1趟
5 6 2 7 8 6 4
第2趟
2 5 6 7 8 6 4
第3趟
2 5 6 7 8 6 4
第4趟
2 5 6 7 8 6 4
第5趟
2 5 6 6 7 8 4
第6趟
2 4 5 6 6 7 8
*/
public void insertSorted(int arr[]) { int n = arr.length; for (int i = 1; i < n; i++) { for (int j = i; j > 0; j--) { if (arr[j] < arr[j - 1])
swap (arr,j, j - 1);
}
System.out.println("\n" + "第" + i + "趟");
printArray(arr);
} } // 效率更优,减少不必要的交换
public void insertSorted2(int arr[]) { int n = arr.length; for (int i = 1; i < n; i++) { int ele = arr[i]; // 当前待比较的元素
int j; // 当前元素最终的下标位置
for (j = i; j > 0 && arr[j - 1] > ele; j--)
arr[j] = arr[j - 1];
arr[j] = ele; System.out.println("\n" + "第" + i + "趟");
printArray(arr);
}
}

三、冒泡排序

    /**
* 冒泡排序 : int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
*
* 第0趟
5 2 6 7 6 4 8
第1趟
2 5 6 6 4 7 8
第2趟
2 5 6 4 6 7 8
第3趟
2 5 4 6 6 7 8
第4趟
2 4 5 6 6 7 8
第5趟
2 4 5 6 6 7 8
第6趟
2 4 5 6 6 7 8
*/
public void bubbleSorted(int arr[]) { int n = arr.length; for (int i = 0; i < n; i++) { for (int j = 0; j < n - i - 1; j++)
if ( arr[j] > arr[j + 1])
swap(arr, j, j + 1); System.out.println("\n" + "第" + i + "趟");
printArray(arr); }
}

四、归并排序

    /**
* 归并排序 :
4 5 2 7 1 6 3
4 5 2 7 1 6 3
2 4 5 7 1 6 3
2 4 5 7 1 6 3
2 4 5 7 1 3 6
1 2 3 4 5 6 7
*/
public void mergeSorted(int arr[]) { int n = arr.length - 1; // 闭区间
splitArray(arr, 0, n); } private void splitArray(int[] arr, int L, int R) { if (L >= R) {
return;
} int mid = L + (R - L) / 2; splitArray(arr, L, mid);
splitArray(arr, mid + 1, R); // merge(arr, L, mid, R); // 优化
if (arr[mid] > arr[mid + 1])
merge(arr, L, mid, R); printArray(arr);
System.out.println(); } private void merge(int[] arr, int L, int mid, int R) { int aux[] = new int[R - L + 1]; for (int i = L; i <= R; i++) { aux[i - L] = arr[i];
} int i = L;
int j = mid + 1; for (int k = L; k <= R; k++) { if (i > mid) {
arr[k] = aux[j - L];
j++;
} else if (j > R) {
arr[k] = aux[i - L];
i++;
} else if (aux[i - L] < aux[j - L]) {
arr[k] = aux[i - L];
i++;
} else if (aux[i - L] > aux[j - L]) {
arr[k] = aux[j - L];
j++;
} else { // 相等情况,
arr[k] = aux[j - L];
j++;
} }
}

五、快速排序

    /**
* 快速排序
*/
public void quickSorted(int arr[]) { int n = arr.length - 1; quickSorted(arr, 0, n);
} private void quickSorted(int[] arr, int L, int R) { if (L >= R)
return; // 单路
// int p1 = partioner(arr, L, R);
//
// quickSorted(arr, L, p1 - 1);
// quickSorted(arr, p1 + 1, R); // 双路
int p2 = partioner2(arr, L, R); quickSorted(arr, L, p2 - 1);
quickSorted(arr, p2 + 1, R);
} // 单路
private int partioner(int[] arr, int L, int R) { int v = arr[L];
int j = L; for (int i = j + 1; i <= R; i++) { if (arr[i] < v) {
swap(arr, i, j + 1);
j++; }
}
swap(arr, j, L); return j;
} // 双路
private int partioner2(int[] arr, int L, int R) { int v = arr[L]; int j = L + 1;
int k = R; while (true) { while (j <= R && arr[j] < v)
j++;
while (k >= L + 1 && arr[k] > v)
k--;
if (k < j)
break; swap(arr, j, k); } swap(arr, L, k); return k;
} // 三路
public void quickSorted3(int arr[]) { int n = arr.length - 1; quickSorted3(arr, 0, n);
} private void quickSorted3(int[] arr, int L, int R) { if (L >= R)
return; int v = arr[L]; int lt = L;
int gt = R + 1;
int i = lt + 1; while (i < gt) { if (arr[i] < v) {
swap(arr, lt + 1, i);
i++;
lt++;
} else if (arr[i] > v) {
swap(arr, i, gt - 1);
gt--;
} else
i++;
}
swap(arr, lt, L); quickSorted3(arr, L, lt - 1);
quickSorted3(arr, gt, R);
}

六、堆排序

    /**
* 堆排序
*/
public void heapSorted(int arr[]) { int n = arr.length; int pos = (n - 1) / 2;
for (int i = pos; i >= 0; i--) {
shiftDown(arr, i, n);
} for (int i = n - 1; i > 0; i--) { swap(arr, 0, i);
shiftDown(arr, 0, i);
} } private void shiftDown(int arr[], int pos, int n) { while (pos * 2 + 1 < n) { int k = (pos * 2) + 1;
if (k + 1 < n && arr[k + 1] > arr[k])
k = k + 1;
if (arr[pos] < arr[k]) {
swap(arr, k, pos);
pos = k;
} else
break;
}
}

七、希尔排序

    /**
* 希尔排序
*/
public void shellSortd(int arr[]) { int n = arr.length; int i, j, h;
int tmp; for (h = n / 2; h > 0; h = h / 2) {
for (i = h; i < n; i++) {
tmp = arr[i];
for (j = i - h; j >= 0; j = j - h) {
if (tmp < arr[j])
arr[j + h] = arr[j];
else
break;
}
arr[j + h] = tmp; }
}
}

java 实现七大基本排序算法的更多相关文章

  1. Java实现经典七大经典排序算法

    利用Java语言实现七大经典排序算法:冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序. 分类 类别 算法 插入排序类 插入排序.希尔排序 选择排序类 选择排序.堆排序 交换排序类 ...

  2. Java 的八种排序算法

    Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...

  3. java SE 常用的排序算法

    java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...

  4. 数据结构(三) 用java实现七种排序算法。

    很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排 ...

  5. Java实现八种排序算法(代码详细解释)

    经过一个多星期的学习.收集.整理,又对数据结构的八大排序算法进行了一个回顾,在测试过程中也遇到了很多问题,解决了很多问题.代码全都是经过小弟运行的,如果有问题,希望能给小弟提出来,共同进步. 参考:数 ...

  6. (2)Java数据结构--二叉树 -和排序算法实现

    === 注释:此人博客对很多个数据结构类都有讲解-并加以实例 Java API —— ArrayList类 & Vector类 & LinkList类Java API —— BigDe ...

  7. [转载]图解程序员必须掌握的Java常用8大排序算法

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,分享给大家一起学习. 分类1)插入排序(直接插入排序.希尔排 ...

  8. [java初探06]__排序算法的简单认识

    今天,准备填完昨天没填的坑,将排序算法方面的知识系统的学习一下,但是在简单的了解了一下后,有些不知如何组织学习了,因为排序算法的种类,实在是太多了,各有优略,各有适用的场景.有些不知所措,从何开始. ...

  9. Java实现各种内部排序算法

    数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...

随机推荐

  1. 单源最短路:Bellman-Ford算法 及 证明

    描述: 求图中某一点到其他任一点的最短距离. 操作: 1. 初始化 结果保存在一个dist数组里,源点的结果初始化为0,其他初始化为无穷大(如INT32_MAX). 2. 计算: 两重for循环,第一 ...

  2. centos7 ntp服务器配置

    一.ntp服务是什么 1. 定义 NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 2. 发展 首次记载在Internet Enginee ...

  3. 分析一则halcon抓边拟合直线的小案例

    例图: 完整算法: read_image (Image, 'C:/Users/Administrator/Desktop/1.png') threshold (Image, Regions, , ) ...

  4. [Training Video - 1] [Selenium Basics] [Download and Install Selenium]

    Download Selenium Jars Configure jars in eclipse Webdriver http://docs.seleniumhq.org/download/ Sele ...

  5. CSS中float和Clear的使用

    CSS中float和Clear的使用 本文和大家重点讨论一下CSS中Float和Clear属性的使用,一个float对象可以居左或居右,一个设置为float的对象,将根据设置的方向,左移或右移到其父容 ...

  6. 判断字符串是否为回文 python

    回文正序和逆序一样的字符串,例如abccba 方法一 def is_palindrome1(text): l = list(text) l.reverse() t1 = ''.join(l) if t ...

  7. arpspoof+ettercap嗅探局域网HTTP/HTTPS账号密码

    开转发 arpspoof -i eth0 -t 192.168.110 192.168.1.1 ettercap -Tq -i eth0 /etc/ettercap/etter.conf /Linux ...

  8. Understanding String Table Size in HotSpot

    In JDK-6962930[2], it requested that string table size be configurable.  The resolved date of that b ...

  9. Charles网络工具

    Charles 是在 Mac 下常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析. Charles 通过将自己设置成系统的网络访问代理服务器,使 ...

  10. 深海划水队项目--七天冲刺之day7

    站立式会议: 昨天已完成的工作:设置游戏按键,检查重合.检查是否超出边界.检查是否可以下落,方块的硬下落和软下落方法. 今日已完成的工作:添加方法:方块的着陆和消除. 工作中遇到的困难:在消除方块的时 ...