主要的排序算法介绍

来源:互联网 发布:医学软件下载 编辑:程序博客网 时间:2024/06/05 01:18

关于排序,本人一直没有深入研究过,在实际的编码中,也偶尔有用到过排序,但我一直都是用的我自己的笨方法(后来知道这种方法的统称叫做选择排序,在后面的排序算法介绍中,我会首先介绍这种我最擅长的排序算法),随着自己编码经验的积累,感觉排序这一块,还是有必要学习一下的,所以就在网上搜索学习了一下主要的排序算法,因为是主要,所以只有八种,以下会用Java代码挨个介绍。


1)、选择排序(Selection Sort)

排序原理:一个数据序列有N个数据元素,那么需要执行N次选择排序:比如第1次排序时把最小的数据元素放在第一个位置,第二次把第2小的元素放在第二个位置,以此类推。

算法特点:时间复杂度为O( N^2 ),不怎么稳定,适用于所有的数据元素。

代码示例:

public class SortAlgorithm{public static void main(String args[]){int []arr = {3,5,7,23,56,23,67,35,67,89,1};System.out.println("这是未排序之前:");for(int i=0; i < arr.length; i++)System.out.print(arr[i]+"  ");System.out.println();Sort sortProcess = new Sort();sortProcess.selectionSort(arr);System.out.println("这是未排序之后:");for(int i=0; i < arr.length; i++)System.out.print(arr[i]+"  ");}}class Sort{public void selectionSort( int[] _a) //选择排序法{for( int pass=0; pass<_a.length; pass++ ) //pass之前的都是已经排序好的{for( int i=pass+1; i<_a.length; i++ ) //我们只需在pass后面的无序序列中遍历一下,找到最小的元素放在pass位置即可{if( _a[i] < _a[pass] ){int temp = _a[i];_a[i] = _a[pass];_a[pass] = temp;}}}}}
程序运行效果如图:


2)、插入排序(InsertSort)

排序原理:这个与选择排序有点类似,也把整个数据序列分为有序和无序两个序列,有序的逐渐扩大,无序的逐渐减小。但与选择排序不同的是:插入排序是把无序序列中最前面的那个数据(还是按照升序排序)插入到有序序列中的合适位置,使得插入后有序序列依然保持有序。

算法特性:时间复杂度O( N^2 ),适用于所有数据元素。

代码示例:

public class SortAlgorithm{public static void main(String args[]){int []arr = {3,5,7,23,56,23,67,35,67,89,1};System.out.println("这是未排序之前:");for(int i=0; i < arr.length; i++)System.out.print(arr[i]+"  ");System.out.println();Sort sortProcess = new Sort();sortProcess.insertSort(arr);for(int i=0; i < arr.length; i++)System.out.print(arr[i]+"  ");}}class Sort{void insertSort(int[] a){int i;for( int pass=1; pass<a.length; pass++) //这个pass就是每次从无序序列中拿出的代插入元素的位置{int temp = a[pass]; //先保存一下这个待插入元素for( i=pass-1; i>=0; i--){if( a[i] < temp ) //如果发现有序中的某个元素小于待插入元素,那么就无需再扫描前面的有序数列了break;elsea[i+1] = a[i];}a[i+1] = temp; //小循环结束,把待插入元素放到这个合适的位置}System.out.println("现在我们使用的是插入排序法,排序后如下:");}}
程序运行效果如图:


3)、冒泡排序(Bubble Sort )

算法原理:比如说我们要进行升序排列,那么先从最前面开始,对挨个相邻的两个数据进行比较,如果发现前面的数据大于后面的那个,那么交换它们,然后再比较下一对相邻的,以此类推,这样比完一组之后,最大的数据就在最后面了。再然后再以此类推,把第2大的数据放在倒数第2个位置。。。

算法特性:时间复杂度O( N^2 ),适用于所有数据类型。

代码示例:

public class SortAlgorithm{public static void main(String args[]){int []arr = {3,5,7,23,56,23,67,35,67,89,1};System.out.println("这是未排序之前:");for(int i=0; i < arr.length; i++)System.out.print(arr[i]+"  ");System.out.println();Sort sortProcess = new Sort();sortProcess.bubbleSort(arr);for(int i=0; i < arr.length; i++)System.out.print(arr[i]+"  ");}}class Sort{void bubbleSort( int[] a){int last = a.length-1; //用last表示成功冒泡数据的前一个位置for( int pass=0; pass<a.length; pass++ ){for( int i=0; i<last; i++ ){if( a[i] > a[i+1] ){int temp = a[i];a[i] = a[i+1];a[i+1] = temp;}}last--; //到这里说明成功的冒出一个大泡,把last往前推一个位置}System.out.println("冒泡排序处理过之后:");}}
程序运行效果如图:


(先写这么多,以后有空会把后面几个较为复杂点的补上来)

1 0
原创粉丝点击