初级排序算法(选择排序、插入排序、希尔排序)
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; } }
相关文章推荐
- C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序
- 算法_基本排序算法之冒泡排序,选择排序,插入排序和希尔排序
- 常用的排序算法(快速排序、插入排序、希尔排序、堆排序、冒泡排序、选择排序、归并排序)
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 排序算法(一):选择排序、插入排序和希尔排序
- 初级排序-选择排序、插入排序、希尔排序总结
- C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序
- 常用的排序算法性能分析(1)—— 选择排序、插入排序、希尔排序
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- C#的排序算法:冒泡排序、选择排序、插入排序和希尔排序
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 常见的排序算法示例(2)-选择排序、插入排序、希尔排序
- 基本排序算法(冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 希尔排序)
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序
- C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较