一)基本概念1 )概念)排序是指将一系列记录按照其中某个关键词或某个关键词的大小,按升序或降序排列的操作。 在平时的上下文中,说到排序,通常是指升序(而不是降序)
2 .稳定性两个相等的数据,排序后,如果排序算法能保证相对位置不变,该算法称为稳定性排序计算
法律。
用简单的图说明一下吧。 图中所示的数据有两个3。 排序后,如果黑3还是红3之后,这样的排序是稳定的,否则是不稳定的。
3.Java一般排序
2 .具体排序代码的实现
1 .直接插入排序
稳定性(稳定性) )稳定性排序是排序中无跳跃性的交换数据
1 .稳定排序变为不稳定排序
2 .本身不稳定的东西就不会稳定
空间复杂性: o(1); 时间复杂性:最佳情况: o(n )序列有序时;
最坏情况:最坏情况o(n2 )序列无序时;
思路:以升序为例
1 .先用I从头遍历数组;
2 .接下来在外面拿一个空格tmp,每次加arr[i];
3 .然后定义变量j。 j的初始值为i-1;
4 .比较arr[j]和tmp的大小,如果大于tmp,则在j 1的位置输入arr[j];
5 .排队直到I遍历数组。
publicstaticvoidinsertsort (int [ ] arr ) for ) intI=1; i arr.length; I({inttmp=arr[I] ); int j=i-1; for (; j=0; j--}{if(arr[j]tmp ) { arr[j 1]=arr[j]; }else{ break; } } arr[j 1]=tmp; (2.希尔排序
稳定性(不稳定) )
1 .稳定排序变为不稳定排序
2 .本身不稳定的东西就不会稳定
空间复杂度: o(n ) 1.3 )-o ) n ) 1.5;
时间复杂性:
最佳情况: o(n )序列有序时;
最坏的情况(最坏的情况) o ) n^2)序列无序的情况
思路:以升序为例
1 .希尔排序实际上是直接插入排序的优化
2 .分组一组数据。 例如,下面的图被分成五个组,并在gap==5的情况下,从第0个位置开始添加gap,以确定集合中的元素。 下面的同种颜色是一组。
3 .然后各组采用直接插入排序的方法,进行排序;
4 .本次排序结束后,接下来分为三组,通过调用直接插入排序,接下来可以分成两组,也可以直接分组;
5 .分组到分组排完顺序,即可排序;
6 .那么,你一定想知道如何选择gap。 你注意到小组数被称为素数了吗? 因此,组数根据数据大小选择合适的像素数组。 例如,下一组数据如果有15个元素,则分别分为5、3、1组。
//希尔排序(优化)直接插入排序) publicstaticvoidshellsort ) int[]arr ) )/1 .首先组数gqpint ) ) drr={ 5,3,1 }; //定义增量数组for (inti=0; i drr.length; I )壳(ARR,drr[i]; }//直接插入排序publicstaticvoidshell(int[]arr,int gap ) ) for ) int gap; i arr.length; I({inttmp=arr[I] ); int j=i-gap; for (; j=0; j -=gap () if ) arr[j]tmp ) { arr[j gap]=arr[j]; }else{ break; } } arr[j gap]=tmp; }3.结果测试公共类测试{//直接插入排序公共类测试(int [ ] arr ) ) for(intI=1; i arr.length; I({inttmp=arr[I] ); int j=i-1; for (; j=0; j--}{if(arr[j]tmp ) { arr[j 1]=arr[j]; }else{ break; } } arr[j 1]=tmp; () /希尔排序)优化直接插入排序)对数组进行分组publicstaticvoidshellsort (int [ ] arr )/1 .首先是组数gqpint ) ) drr={ 5,3,1 }; //定义增量数组for (inti=0; i drr.length; I )壳(ARR,drr[i]; }//直接插入排序publicstaticvoidshell(int[]arr,int gap ) ) for ) int gap; i arr.length; I({inttmp=arr[I] ); int j=i-gap; for (; j=0; j -=gap () if ) arr[j]tmp ) { arr[j gap]=arr[j]; }else{ break; } } arr[j gap]=tmp; }//测试主方法publicstaticvoidmain (string [ ] args ) ) /直接插入排序int [ ] arr={ 2,3,5,1,6,4 }; 插入(arr ); 直接插入System.out.print (排序结果: ); for(intI=0; i arr.length; I ) system.out.print(arr[I] ' ); } System.out.println (; //希尔排序int [ ] arr1={ 7,4,9,34,0,8,5,22,55,6,12,33,56,89,77 }; 壳核快照(arr1; System.out.print (希尔排序结果: ); for(intI=0; i arr1.length; I ) {system.out.print(arr1[I] '; } System.out.println (; }