插入排序将数组分为未排序和已排序。首先将数组第一个默认为已排序。然后将后面的未排序的元素不断的插入到已排序的区域。
该排序算法的缺点:每次插入时,都必须将元素与前面已排序的元素比较,来确定正确的位置。这样的话,需要大量的赋值操作。时间复杂度:最好O(n),最差O(n^2).稳定算法。
/*插入排序 N为数组个数*/ static void InsertSort(int[] M) { int pos=0,temp; for (int i = 1; i < M.length; i++) { pos=i; temp=M[i]; while (pos>0 && M[pos]<M[pos-1]) { M[pos]=M[pos-1]; M[pos-1]=temp; pos--; } } }
元素同样分为已排序和未排序两个区域。该排序算法需要将效率特别低,不建议使用。时间复杂度:最好O(n),最差O(n^2),稳定算法。
static void BubbleSort(int[] M) { int temp; //中间变量 for (int i = 0; i < M.length-1; i++) for (int j = i+1; j < M.length; j++) if (M[i]>M[j]) { temp=M[j]; M[j]=M[i]; M[i]=temp; } }
选择排序每次遍历的时候是选出一个最大值或者最小值的索引,放到数组的指定位置。相比于其他赋值次数较少。时间复杂度:最好O(n),最差O(n^2).不稳定算法。
static void SelectSort(int[] M) { int pos,temp; for (int i = 0; i < M.length-1; i++) { pos=i; for (int j = i+1; j < M.length; j++) if(M[pos]>M[j]) pos=j; temp=M[i]; M[i]=M[pos]; M[pos]=temp; } }
由于开始时,步长的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期步长取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。当步长取到1的时候,则变为了简单的插入排序。
static void ShellSort(int[] M) { int gap=M.length/2-1; int pos,temp; while(gap>0) { for (int i = 0; i < gap+1; i++) { for (int j = i+gap; j < M.length; j+=gap) { pos=j; temp=M[j]; while (pos>i && M[pos]<M[pos-gap]) { M[pos]=M[pos-gap]; M[pos-1]=temp; pos-=gap; } } } gap/=2; } }
考察排序算法的时候有一个很重要的特性,就是算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序算法是稳定的;否则称为不稳定的。