java的简单排序算法
2017-10-15 13:42
274 查看
java的简单排序算法
排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。
内排序有可以分为以下几类:
(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。
(2)、选择排序:简单选择排序、堆排序。
(3)、交换排序:冒泡排序、快速排序。
(4)、归并排序
(5)、基数排序
冒泡排序:
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序的示例:
![](http://my.csdn.net/uploads/201207/20/1342782078_9990.jpg)
1、冒泡排序的算法实现如下:【排序后,数组从小到大排列】:
2、简单选择排序
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
简单选择排序的示例:
![](http://my.csdn.net/uploads/201207/18/1342586432_7130.jpg)
实现代码:
3.直接插入排序
思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。
•关键问题:在前面已经排好序的序列中找到合适的插入位置。
•方法:
–直接插入排序
–二分插入排序
–希尔排序
①直接插入排序(从后向前找到合适位置后插入)
1、基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
2、实例
![](http://images.cnitblog.com/blog/420264/201307/24160822-d0957aa2ca8a4500bfc84dbf36865578.png)
实现代码:
4.快速排序
思路:
1、选取一个元素作为基准元素,通常选择第一个元素或最后一个元素。
2、经过一轮排序后,将比基准元素小的放在元素放在左边,形成左序列,将比基准元素小的元素放在右边,形成右数列。
3、再用同样的方法递归地排序划分的两部分。对左序列和又序列做1、2步操作
2、实例
![](http://images.cnitblog.com/blog/420264/201307/24171935-597769220aca4efdb3b155dbe11a5bec.png)
实现代码:
5.归并排序:
1、基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
2、实例
![](http://images.cnitblog.com/blog/420264/201307/24172910-865a3743068a4c9fadce3dddb625e619.png)
3、java代码实现
排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。
内排序有可以分为以下几类:
(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。
(2)、选择排序:简单选择排序、堆排序。
(3)、交换排序:冒泡排序、快速排序。
(4)、归并排序
(5)、基数排序
冒泡排序:
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序的示例:
![](http://my.csdn.net/uploads/201207/20/1342782078_9990.jpg)
1、冒泡排序的算法实现如下:【排序后,数组从小到大排列】:
/** * 冒泡排序 * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 * 针对所有的元素重复以上的步骤,除了最后一个。 * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 * @param numbers 需要排序的整型数组 */ public static void bubbleSort(int[] numbers) { int temp = 0; int size = numbers.length; for(int i = 0 ; i < size-1; i ++) { for(int j = 0 ;j < size-1-i ; j++) { if(numbers[j] > numbers[j+1]) //交换两数位置 { temp = numbers[j]; numbers[j] = numbers[j+1]; numbers[j+1] = temp; } } } }
2、简单选择排序
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
简单选择排序的示例:
![](http://my.csdn.net/uploads/201207/18/1342586432_7130.jpg)
实现代码:
public class ChoiceSort { public static void _choiceSort(Integer[] a) { if (a == null || a.length <= 0) { return; } for (int i = 0; i < a.length; i++) { int min = i; /* 将当前下标定义为最小值下标 */ for (int j = i + 1; j < a.length; j++) { if (a[min] > a[j]) { /* 如果有小于当前最小值的关键字 */ min = j; /* 将此关键字的下标赋值给min */ } } if (i != min) {/* 若min不等于i,说明找到最小值,交换 */ int tmp = a[min]; a[min] = a[i]; a[i] = tmp; } } } }
public static void main(String[] args) { // TODO Auto-generated method stub Integer[] list={49,38,65,97,76,13,27,14,10}; //快速排序 /* QuicSort qs=new QuicSort(); qs.quick(list);*/ //冒泡排序 /* BubbleSort bs=new BubbleSort(); bs.bubble(list);*/ //选择排序 ChoiceSort._choiceSort(list); for(int i=0;i<list.length;i++){ System.out.print(list[i]+" "); } System.out.println(); }
3.直接插入排序
思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。
•关键问题:在前面已经排好序的序列中找到合适的插入位置。
•方法:
–直接插入排序
–二分插入排序
–希尔排序
①直接插入排序(从后向前找到合适位置后插入)
1、基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
2、实例
![](http://images.cnitblog.com/blog/420264/201307/24160822-d0957aa2ca8a4500bfc84dbf36865578.png)
实现代码:
package com.sort; public class 直接插入排序 { public static void main(String[] args) { int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1}; System.out.println("排序之前:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } //直接插入排序 for (int i = 1; i < a.length; i++) { //待插入元素 int temp = a[i]; int j; /*for (j = i-1; j>=0 && a[j]>temp; j--) { //将大于temp的往后移动一位 a[j+1] = a[j]; }*/ for (j = i-1; j>=0; j--) { //将大于temp的往后移动一位 if(a[j]>temp){ a[j+1] = a[j]; }else{ break; } } a[j+1] = temp; } System.out.println(); System.out.println("排序之后:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } } }
4.快速排序
思路:
1、选取一个元素作为基准元素,通常选择第一个元素或最后一个元素。
2、经过一轮排序后,将比基准元素小的放在元素放在左边,形成左序列,将比基准元素小的元素放在右边,形成右数列。
3、再用同样的方法递归地排序划分的两部分。对左序列和又序列做1、2步操作
2、实例
![](http://images.cnitblog.com/blog/420264/201307/24171935-597769220aca4efdb3b155dbe11a5bec.png)
实现代码:
package com.sort; //不稳定 public class 快速排序 { public static void main(String[] args) { int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8}; System.out.println("排序之前:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } //快速排序 quick(a); System.out.println(); System.out.println("排序之后:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } } private static void quick(int[] a) { if(a.length>0){ quickSort(a,0,a.length-1); } } private static void quickSort(int[] a, int low, int high) { if(low<high){ //如果不加这个判断递归会无法退出导致堆栈溢出异常 int middle = getMiddle(a,low,high); quickSort(a, 0, middle-1); quickSort(a, middle+1, high); } } private static int getMiddle(int[] a, int low, int high) { int temp = a[low];//基准元素 while(low<high){ //找到比基准元素小的元素位置 while(low<high && a[high]>=temp){ high--; } a[low] = a[high]; while(low<high && a[low]<=temp){ low++; } a[high] = a[low]; } a[low] = temp; return low; } }
5.归并排序:
1、基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
2、实例
![](http://images.cnitblog.com/blog/420264/201307/24172910-865a3743068a4c9fadce3dddb625e619.png)
3、java代码实现
package com.sort; 2 3 //稳定 4 public class 归并排序 { 5 public static void main(String[] args) { 6 int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8}; 7 System.out.println("排序之前:"); 8 for (int i = 0; i < a.length; i++) { 9 System.out.print(a[i]+" "); 10 } 11 //归并排序 12 mergeSort(a,0,a.length-1); 13 System.out.println(); 14 System.out.println("排序之后:"); 15 for (int i = 0; i < a.length; i++) { 16 System.out.print(a[i]+" "); 17 } 18 } 19 20 private static void mergeSort(int[] a, int left, int right) { 21 if(left<right){ 22 int middle = (left+right)/2; 23 //对左边进行递归 24 mergeSort(a, left, middle); 25 //对右边进行递归 26 mergeSort(a, middle+1, right); 27 //合并 28 merge(a,left,middle,right); 29 } 30 } 31 32 private static void merge(int[] a, int left, int middle, int right) { 33 int[] tmpArr = new int[a.length]; 34 int mid = middle+1; //右边的起始位置 35 int tmp = left; 36 int third = left; 37 while(left<=middle && mid<=right){ 38 //从两个数组中选取较小的数放入中间数组 39 if(a[left]<=a[mid]){ 40 tmpArr[third++] = a[left++]; 41 }else{ 42 tmpArr[third++] = a[mid++]; 43 } 44 } 45 //将剩余的部分放入中间数组 46 while(left<=middle){ 47 tmpArr[third++] = a[left++]; 48 } 49 while(mid<=right){ 50 tmpArr[third++] = a[mid++]; 51 } 52 //将中间数组复制回原数组 53 while(tmp<=right){ 54 a[tmp] = tmpArr[tmp++]; 55 } 56 } 57 }
相关文章推荐
- Java中几种简单的排序算法
- JAVA实现常见简单排序算法
- 几种排序算法java简单实现
- 学习JAVA中(一) 一些简单的排序算法
- Java中的几种排序算法:冒泡排序,插入排序,二分法排序,简单排序,快速排序
- java简单的排序算法复习(冒泡、快速)
- java几种排序算法的实现及简单分析
- 关于基本排序算法的简单研究总结(java 实现)
- 几个简单的排序算法(java版)
- 排序算法之简单插入法排序(Java)
- java之最简单和最复杂的排序算法
- 三种简单的排序算法(java实现)
- C语言、Java学习笔记(三)---几种简单的排序算法
- 黑马程序员——JAVA基础之简单的排序算法
- java实现简单的排序算法
- 黑马程序员——Java基础语法:几种简单的排序算法的实现
- java简单实现常用的排序算法
- 11JAVA简单的排序算法--冒泡算法
- Java实现一部分简单的排序算法和数据结构(学习笔记20171022002)
- 001-简单的java代码实现几种排序算法(插入,快速,冒泡,选择)