您的位置:首页 > 其它

【算法】 简单选择排序与直接插入排序

2017-08-18 19:57 295 查看
          简单选择排序与直接插入排序算是排序算法里最简单的两个算法了,做个对比就更容易理解了。

      

简单选择排序

      简单选择排序就是在要排序的数组中,选出最小或者最大的一个数与第一个位置数进行交换,然后在剩下的数当中在找最小或者最大的数与第二个位置的数进行交换,知道第n-1个元素。下面看一下代码

     public class StraightInsertionSort {
/**
* 直接插入排序
*
* @param a
* @param n
*/

public static int[] InsertSort(int a[], int n) {
for (int i = 1; i < n; i++)//从第二个记录开始,往前面的序列中插入
{
if (a[i] < a[i - 1]) { //如果待排数小于前一个数,移动有序表,然后插入
int j=i-1;
int x=a[i];////复制为哨兵,即存储待排序元素
a[i]=a[i-1];//移动有序表.
while (x<a[j]){
a[j+1]=a[j];//元素后移.
j--;
}
a[j+1]=x;//为什么赋值到j+1中,因为j--了,while不再循环了.
}
}
return a;
}

public static void main(String[] args) {
int a[]={3,12,44,5,53,61,67,84,7,88,90};
InsertSort(a,a.length);
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
}

     

直接插入排序

      直接插入排序就是先将序列的第一个记录看成是一个有序的子序列,然后从第二个记录逐个进行插入,直到整个序列有序为止。

public class SimpleSelectionSort {

/**
* 简单选择排序
* 在要排序的一组数中,
* 选出最小(或者最大)的一个数与第1个位置的数交换;
* 然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换... ...
* 直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
*/
public static int[] sort(int a[])
{
int n=a.length;
for(int i=0;i<n;i++)
{
//选择第i个元素之后中最小的值
for(int j=i+1;j<n;j++)
{
int minKey=i;//保存值最小的key.并假设第i个为最小值.
for(j=i+1;j<n;j++)
{
if (a[j] < a[minKey])//
{
minKey = j;
}
}
//交换
if(minKey!=i)
{
int temp=a[i];
a[i]=a[minKey];
a[minKey]=temp;
}
}
}
return a;
}

public static void main(String[] args) {
int a[]={3,12,44,5,53,61,67,84,7,88,90};
sort(a);
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
}


对比

简单选择排序和直接插入排序都是比较简单的排序方法,代码理解起来也比较简单。对于

这两个排序算法来说,我们对于序列都看成了两个部分,分别为已排子序列和待排子序列。

直接插入排序把第1个元素看成是已排好的子序列,而后面的元素为待排序列。插入操作

就是从后面的待排序列中一个个拿出来插入到前面的已排好的子序列。

而选择排序也是把第0个元素当成是已排好的序列,而后面的元素为待排序列。选择操作

就是从后面的待排序列中选择一个最大或者最小的元素然后和第一个元素进行交换。直到待排序

中的元素为0.当然我们也可以每次选择两个,最大的和最小的放到前面的已排好的序列。

 


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: