关于排序,本人一直没有深入研究过,在实际的编码中,也偶尔有用到过排序,但我一直都是用的我自己的笨方法(后来知道这种方法的统称叫做选择排序,在后面的排序算法介绍中,我会首先介绍这种我最擅长的排序算法),随着自己编码经验的积累,感觉排序这一块,还是有必要学习一下的,所以就在网上搜索学习了一下主要的排序算法,因为是主要,所以只有八种,以下会用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;
else
a[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("冒泡排序处理过之后:");
}
}
程序运行效果如图:
(先写这么多,以后有空会把后面几个较为复杂点的补上来)