大家都知道,对于数据结构有三种简单的排序:冒泡排序,选择排序和插入排序,说他们简单是因为他们在排序的速度相对较慢,而且排序的算法也比较简单,更适用于数据量小的文件排序中。下面我们就分别来分析一下这三种排序。
首先来说说冒泡排序:它是这三种排序中最简单也是最为人熟悉的一种排序,它的思想是用每一次循环来固定一个值的位置。很显然,当我们有N个值的时候,我们就需要比较N-1趟,在每一趟的确定值中,我们还需要比较很多次,这个比较的次数会随着固定值的增多而减少。现在,我们以排出数组的升序为例:假如我们现在有这样的一个数组int []a={12,1,23,45,14,17},我们需要确定最后一个数的值。这个时候我们可以先定义一个变量b,然后比较a[0]和a[1]的大小,若a[0]<a[1],则a[1]继续和a[2]比较,若a[0]>a[1],则将b=a[1];
a[1]=a[0];a[1]=b;依次类推,他们都是相邻两个数的比较,而且到最后两个数比较时,总有一个数是最大值,这样我们就找出了最大值。在第二趟的比较中,相邻两个数的比较次数自然就会减少一次,,,,这样每一趟下来就能确定所有比较数中的最大值。升序就不成问题了,话不多说,以上述例子为例,直接上核心代码吧!
for(int i=0;i<a.length-1;i++){ //因为一共a.length个数,但只需要比较a.length-1次for(int j=0;j<a.length-1-i;j++){ //每一趟就会减少i个数,且减1和上面的原因一样
if(a[j]>a[j+1]){
b=a[i];
a[i]=a[i+1];
a[i+1]=b;
}
}
说完最简单的排序,下面我们来说说选择排序。其实,选择排序是在冒泡排序的基础上进行的改进,将冒泡排序的每比较一次就交换位置的思想调整为每外循环一次才交换一下位置,每次循环都找出最小的值,跟循环起点的交换。这样我们在比较次数不变的情况下,减少了交换的次数。代码如下:
for(int i=0;i<a.length-1;i++){
int n,m; //定义两个变量,一个存放临时最小值的下标,一个用以交换位置是使用
for(int j=0;j<a.length-i-1;j++){
if(a[j]>a[j+1]){
n=j;
}
}
if(a[i]>a[n]){
m=a[i];
a[i]=a[j];
a[j]=m;
}
}
说完以上两种类似的排序,下面我们来说说比以上两种更优秀的排序吧----------插入排序。插入排序的基本思想是:在一堆数的左边是有序的,而在数的后半部分是无序,这时我们只需要将右边的数一个个的插入到左边,就可以完成排序。在这个思想中,我们运用了极限的思想,因为在排序前我们没有必要去判断左边到底到哪个数为止才是无序的,所以我们默认将第二个数开始就认为是无序的,而第一个数永远保持有序,同样我们来看一下实现的代码吧!
int m; //首先定义一个要插入的位置的
for(int i=1;i<a.length-1;i++){
int n;
n=a[i]; //要插入的值
m=i;
while(m>0&&a[m-1]>n){
a[m]=a[m-1];
m--;
}
a[m]=n;
}
到这里三种简单的排序就算讲完了,大家可以自己体会一下,当然有什么问题,也可以提醒我