1、排序算法种类介绍
在学习排序算法之前需要对排序算法的分类有一个简单的了解。
冒泡排序算法和快速排序算法的基本操作都是交换两个元素的值,所以他们都属于交换排序算法。选择排序和堆排序算法的基本操作都是从所有元素中挑出最大(或最小)值,所以他们都属于选择排序算法。插入排序和shell排序算法的基本操作都是将一个元素插入到合适的位置,所以他们都属于插入排序。
上述几种基本排序算法直接对计算机内存进行排序。而对于一些大的文件,由于计算机的内存有限,往往不能直接将其读入内存进行排序。这时可以采用多路归并排序算法,将文件划分为几个能够读入内存的小部分,然后分别进行排序,经过多次处理即可完成大文件的排序。
每一种排序算法都有其各自的特点,往往在某些特定场合具有良好的执行效率,因此需要根据实际问题的需要来合理选择排序算法。
2、算法实现经典示例(java实现)
2.1、冒泡排序算法
冒泡排序算法是所有排序算法中最简单、最基本的一种。冒泡排序算法的思路就是交换排序,通过相邻数据的交换来达到排序的目的。
实现思路:冒泡排序算法通过多次比较和交换来实现排序,其排序流程如下
1、对数组中的各数据,依次比较相邻的两个元素的大小。
2、如果前面的数据大于后面的数据,就交换这两个数据(这里说明了了冒泡排序属于交换排序)。经过第一轮的多次比较后 ,就可以将最大的数据排好。
3、再用同样的方法把剩下的数据逐个进行比较,最后便可按照从小到大的顺序排列好数组中的数据。
具体代码如下:
/**
* @author lqf
* describe:冒泡排序算法
*
* 2015-4-2
*/
public class P4_1_Exchange_BubbleSort {
static final int SIZE =10;
/**
* @return
*/
static int geneNum(){
int tempNum =(int)(Math.random()*100.0);
return tempNum;
}
/**
* @param a
*/
static void bubbleSort(int[] a){
for(int i=1;i<a.length;i++){
for(int j=0;j<a.length-i;j++){
if(a[j]>a[j+1]){
int temp = a[j];
a[j]=a[j+1];
a[j+1] = temp;
}
}
System.out.print("第"+i+"步排序结果为:");
for(int k=0;k<a.length;k++){
System.out.print(a[k]+" ");
}
System.out.print("\n");
}
}
public static void main(String[] args){
int[] array = new int[SIZE];
for(int i=0;i<10;i++){
array[i]= P4_1_Exchange_BubbleSort.geneNum();
}
System.out.print("排序前的数组为:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.print("\n");
P4_1_Exchange_BubbleSort.bubbleSort(array);
System.out.print("排序后的数组为:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
}
2.2、选择排序算法
选择排序算法也是比较简单的排序算法,其思路比较直观。选择排序算法在每一步中选取最小值来重新排列,从而达到排序的目的。
实现思路:选择排序算法通过选择和交换实现排序,其排序流程如下:
1、首先从原始数组中选择最小的1个数据,将其和位于第一个位置的数据交换。
2、接着从剩下的n-1(不包括已经放到第一个位置的最小的数据)个数据中选择最小的1一个数据,将其和第二个位置的数据交换。
3、然后不断重复上述过程,直到最后两个数据完成交换。
具体代码如下:
/**
* @author Mr0
* describe:选择排序算法,无论原始数据有无顺序,都需要进行n-1步的中间排序。
* 这种排序方法思路很简单直观,但是缺点是执行的步骤稍长。
*
*/
public class P4_2_Select_SelectSort {
static final int SIZE =10;
/**
* @return
*/
static int geneNum(){
int tempNum =(int)(Math.random()*100.0);
return tempNum;
}
/**
* @param a
*/
static void selectSort(int[] a){
for(int i=1;i<=a.length;i++){
int index = i-1;
for(int j=i-1;j<a.length;j++){ //重点是找到数组中值最小的元素的index,只找到元素的值而不取出index是不行的
if(a[j]<a[index]){
index = j;
}
}
int temp=a[i-1];
a[i-1]=a[index];
a[index] = temp;
System.out.print("第"+i+"步排序结果为:");
for(int k=0;k<a.length;k++){
System.out.print(a[k]+" ");
}
System.out.print("\n");
}
}
public static void main(String[] args){
int[] array = new int[SIZE];
for(int i=0;i<10;i++){
array[i]= P4_2_Select_SelectSort.geneNum();
}
System.out.print("排序前的数组为:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.print("\n");
P4_2_Select_SelectSort.selectSort(array);
System.out.print("排序后的数组为:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
}
2.3、插入排序算法
插入排序算法通过对未排序的数据执行逐个插入至合适的位置而完成排序工作。插入排序算法的思路比较简单,应用比较多。
实现思路:
1、首先对数组的前两个数据进行从小到大的排序。
2、接着将第3个数据与排好序的两个数据比较,将第3个数据插入合适的位置。
3、然后将第4个数据插入已排好序的前3个数据中
4、不断重复上述过程,直到把最后一个数据插入合适的位置。最后便完成了对原始数组从小到大的排序。
具体代码如下:
/**
* @author Mr0
* describe:插入排序算法,在原始数据已经有一定顺序的情况下,排序效率较好。但是如果数据无规则,
* 则需要移动大量的数据,其排序效率也不高。
*
*/
public class P4_3_Insert_InsertSort {
static final int SIZE =10;
/**
* @return
*/
static int geneNum(){
int tempNum =(int)(Math.random()*100.0);
return tempNum;
}
/**
* @param a
*/
static void insertSort(int[] a){
for(int i=1;i<a.length;i++){
int j=i-1;
int t=a[i];
while(j>=0 &&t<a[j] ){
a[j+1]=a[j];
j--;
}
a[j+1] = t;
System.out.print("第"+i+"步排序结果为:");
for(int k=0;k<a.length;k++){
System.out.print(a[k]+" ");
}
System.out.print("\n");
}
}
public static void main(String[] args){
int[] array = new int[SIZE];
for(int i=0;i<10;i++){
array[i]= P4_3_Insert_InsertSort.geneNum();
}
System.out.print("排序前的数组为:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.print("\n");
P4_3_Insert_InsertSort.insertSort(array);
System.out.print("排序后的数组为:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
}
上面介绍的冒泡排序算法、选择排序算法和插入排序算法,虽然思路比较直观,但是排序的效率比较低。下面将介绍几种更加高效的排序算法,这些算法都来自于对前面3种算法的改进,理解透彻前面3种算法对于理解下面介绍的算法有很大的帮助。