<强> 1。直接插入排序强>
思想:将第i个插入到前张个中的适当位置
时间复杂度:T (n)=O (n²)。
空间复杂度:年代(n)=O (1)。
稳定性:稳定排序。
如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。
所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定
哨兵有两个作用:
①进人查找(插入位置)循环之前,它保存了R(我)的副本,使不致于因记录后移而丢失R(我)的内容;
②它的主要作用是:在查找循环中“监视“下标变量j是否越界。一旦越界(即j=0),因为R[0]。可以和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界(即省略了循环判定条件j>=1)
公共空间insertSort (int[]数组){ for (int i=1; i< array.length;我+ +)//第0位独自作为有序数列,从第1位开始向后遍历 { 如果(array[我]& lt;数组(张))//0 ~张位为有序,若我第位小于张位,继续寻位并插入,否则认为0 ~我位也是有序的,忽略此次循环,相当于继续 { int temp=array[我];//保存我第位的值 int k=i - 1; for (int j=k; j>=0,,temp<数组[j]; j -)//从张第位向前遍历并移位,直至找到小于第我位值停止 { array [j + 1]=array [j]; k,; } 数组(k + 1)=temp;//插入第我位的值 } } }
<强> 2。折半插入排序强>
思想:将数据插入到已经排好序的序列中,通过不断与中间点比较大小来确定位置
时间复杂度:比较时的时间减为O (n㏒n),但是移动元素的时间耗费未变,所以总是得时间复杂度还是O (n²)。
空间复杂度:年代(n)=O (1)。
稳定性:稳定排序。
<强> 3。希尔排序强>
思想:又称缩小增量排序法。把待排序序列分成若干较小的子序列,然后逐个使用直接插入排序法排序,最后再对一个较为有序的序列进行一次排序,主要是为了减少移动的次数,提高效率。原理应该就是从无序到渐渐有序,要比直接从无序到有序移动的次数会少一些。
时间复杂度:O (n的1.5次方)
空间复杂度:O (1)
稳定性:不稳定排序。{2、4、1、2},2和1一组4和2一组,进行希尔排序,第一个2和最后一个2会发生位置上的变化。
公共静态void main (String [] args) { int[]={49岁,38岁,65年,97年,76年,13日,27日,49岁,78年,34岁,12日,64年,1}; System.out.println(“排序之前:”); for (int i=0; i
<强> 强>
时间复杂度:T (n)=O (n²)。
空间复杂度:年代(n)=O (1)。
稳定性:稳定排序。
公开课BubbleSort { 公共空间排序(int []) { int temp=0; for (int i=3ざ? 1;我在;0;——我) { for (int j=0;j & lt;我;+ + j) { 如果([j + 1] & lt;[j]) { temp=[j]; 一个[j]=[j + 1); [j + 1)=temp; } } } } }<强> 强>
思想:对冒泡排序的改进,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
详细总结各种排序算法(Java实现)