您的位置:首页 > 其它

初级排序算法(选择排序、插入排序、希尔排序)

2013-08-20 22:43 232 查看

选择排序

1.定义:首先,找到数组中的最小的那个元素,其次,将他和数组中的第一个元素交换位置。再次,在剩下的元素中找到最小的元素,将它和数组中第二个元素交换位置。如此反复,知道将整个数组排序。这种方法叫做选择排序(因为它在不断的选择剩余元素中的最小者)。
2.算法的时间效率取决于比较的次数。长度为N的数组,选择排序大约需要N^2/2次比较和N次交换。
  (N-1)+(N-2)+。。。+2+1=N(N-1)/2~N^2/2
3.特点:A.运行时间和输入无关。(一个已经有序的数组和随机的数组所用时间一样)
              B.数据移动是最少的。
4.代码如下:
public static void selectsort(Comparable[] a)
{//将a[] 按升序排序
int N=a.length;
for(int i=0;i<N;i++)
{ //将a[i]和a[i+1..N]中的最小值元素交换
int min=i;
for(int j=i+1;j<N;j++)
{
//比较
if(less(a[j],a[min])) min=j;
}
//交换
exch(a,i,min);
// assert isSorted(a, 0, i);
}
}
// is v < w ?
private static boolean less(Comparable v, Comparable w) {
return (v.compareTo(w) < 0);
}
// exchange a[i] and a[j]
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}

插入排序

1.定义:通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。计算机中为了给要插入的元素腾出空间,我们需要把其余的所有的元素在插入之前都向右移动一位。这种算法叫做插入排序。
2.插入排序所需的时间取决于输入元素的初始顺序。(对一个很大且其中元素有序的数组进行排序比随机顺序的数组或者逆序的数组要快的多)
对于随机排列的长度N且主键不重复的数组,平均情况插入排序需要~N^2/4次比较和N^2/4次交换。
最坏情况:~N^2/2次比较和N^2/2次交换
最好情况:N-1次比较和0次交换
3.代码如下:
private static void InsertSort(Comparable[] a)
{
int N=a.length;
for(int i=1;i<N;i++)
{
//将a[i]与a[0]到a[i-1]中比它小的一次有序的交换
for(int j=i;j>0;j--)
{
if(less(a[j],a[j-1])) exch(a,j,j-1);
}
}
}


4.一般情况是部分有序数组:
   A.数组中每个元素距离它的最终位置都不远
   B.一个有序大数组接一个小数组
   C.数组中只有几个元素位置不正确

希尔排序

1.定义:一种基于插入排序的快速的排序算法。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数字排序。思想:使数组中任意间隔为h的元素都是有序的。这样的数组被称为h有序数组。
2.希尔排序更高效的原因是它权衡了子数组的规模和有序性。排序之初,各个子数组都很短,排序之后子数组都是部分有序的,这两种情况都很适合插入排序
3.代码如下:
private static void shell(Comparable[] a)
{
int N=a.length;
int h=1;
while(h<N/3) h=h*3+1; //1,4,13,40
while(h>=1)
{
for(int i=h;i<N;i++)
{//将a[i]插入到a[i-h],a[i-2*h],a[i-3*h]...之中
for(int j=i;j>=h;j-=h)
{
if (less(a[j],a[j-h])) exch(a,j,j-h);
}
}
h=h/3;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 排序算法
相关文章推荐