1.选择排序
思想:首先,找到数组中最小的那个元素,其次,将它与数组中第一个元素交换位置。然后,在剩下的元素中在找到最小的值,将它与数组中第二个元素交换位置。这种不断选择最小元素的排序称为选择排序。
代码实现:1.首先是比较两个值大小的方法,使用了compareto方法,改方法返回0,1,-1.若v<w返回负1。
private static boolean less(Comparable v,Comparable w)
{
return v.compareTo(w)<0;
}
2.交换两个元素的位置
private static void exch(Comparable[] a,int i,int j)
{
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
3.选择排序算法。
public static void sort(Comparable[] a){
int N=a.length;
for(int i=0;i<N;i++)
{
//内循环,将a[i]与a[i+1]到a[n-1]中的最小元素交换
int min=i;//用min作为最小元素的索引,先假设a[i]为最小元素
for(int j=i+1;j<N;j++)
{
//如果a[min]>a[j] 交换
if(less(a[j], a[min]))
{
min=j;
exch(a, min, j);
}
}
}
}
2.插入排序
思想:与选择排序一样,当前索引左边的所有元素都是有序地,但他们的最终位置还不确定,所以将大的元素排到右边去,当索引
到达数组的最右边时,排序完成。
代码实现:1.插入排序算法
public static void SelectSort(Comparable[] a){
int N=a.length;
for(int i=0;i<N;i++){
//内循环中只判断当前索引是否比前一个索引处的值小,如果小,交换位置,保证了当前索引左边的是排序好的。
for(int j=i;j>0&&less(a[j], a[j-1]);j--)
{
exch(a, j, j-1);
}
}
}
3.总结
首先,我们可以发现排序算法的问题,就是不管当前数组是否为有序数组,或者接近有序数组,它都要进行循环。所以这个
算法的效率是不够高的。但是插入算法能够立即发现每个元素是否在合适的位置上,而且循环判断与访问数组的次数明显减少,效率
较快。