网站建设会计,外贸网站如何做外链,自己的网站怎么做关键词,培训机构咨询一#xff1a;排序引入 我们通常从哪几个方面来分析一个排序算法#xff1f; 1.时间效率#xff1a;决定了算法运行多久#xff0c;O#xff08;1#xff09; 2.空间复杂度#xff1a; 3.比较次数交换次数:排序肯定会牵涉到两个操作#xff0c;一个比较是肯定的。…     一排序引入      我们通常从哪几个方面来分析一个排序算法         1.时间效率决定了算法运行多久O1         2.空间复杂度         3.比较次数交换次数:排序肯定会牵涉到两个操作一个比较是肯定的。交换。         4.稳定性这是什么 1 9 3 5 3                 第一种1 3 3 5 9                 第二种1 3 3 5 9  哪一种是稳定的相同的两个数排完序后相对位置不变。         稳定排序有什么意义应用在哪里呢                 1.电商里面订单排序首先会按金额从小到大排金额相同的按下单时间。我从订单中心过来的时候已经按照时间排好序了。我选择排序算法如果我选择不稳定的排序算法 那我还要比较两次的如果我选择稳定的排序算法 那我就只要比较一个字段。 二 核心思想 假设有个这样的问题打扑克。分成两部分一部分是你手里的牌已经排好序一部分是要拿的牌无序。         把一个无序的数列一个个插入到有序数列中。 一个有序的数组我们往里面添加一个新的数据后如何继续保持数据有序呢我们只要遍历数组找到数据应该插入的位置将其插入即可。 三 具体步骤 1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素         2.到未排序段取元素插入到已排序段并保证插入后仍然有序         3.重复执行上述操作直到未排序段元素全部加完。 四举例 看以下这个例子对7 8 9 0 4 3进行插入排序 7 8 9 0 4 3 7 8 9 0 4 3 7 8 9 0 4 3 0 7 8 9 4 3 0 4 7 8 9 3 0 3 4 7 8 9 从以上操作中我们看到插入排序会经历一个元素的比较以及元素的移动。当我们从待排序列中取一个数插入到已排序区间时需要拿它与已排序区间的数依次进行比较直到找到合适的位置然后还要将插入点之后的元素进行往后移动。 五插入排序代码实现、 
package sort;/*** 插入排序*/
public class InsertionSort {/*** 1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素 2.到未排序段取元素插入到已排序段并保证插入后仍然有序3.重复执行上述操作直到未排序段元素全部加完。* * param args*/public static void main(String[] args) {int a[]  { 9, 8, 7, 0, 1, 3, 2 };int n  a.length;//这里面会有几层循环 2//时间复杂度n^2//最好的情况什么情况下O(n); O(1)//for(){		//分段for(int i  1 ; i  n;i){		//为什么i要从1开始 第一个不用排序我们就把数组从i分开0~I的认为已经排好序int data  a[i];int j  i -1;for(;j0;j--){//从尾到头 12345...nif(a[j]  data){a[j1]  a[j];		// 数据往后移动}else{	//因为前面已经是排好序的 那么找到一个比他小的就不用找了因为前面的肯定更小break; //O(1)		如果这个break执行的越多 那么我是不是效率就越高?}}	a[j1]  data;System.out.print(第 i 次的排序结果为);for(j  0 ; j  n;j){System.out.print(a[j] );}System.out.println();}}}六优化 希尔排序插入排序改进版 希尔排序是把记录按下标的一定增量分组对每组使用直接插入排序算法排序随着增量逐渐减少每组包含的关键词越来越多当增量减至1时整个文件恰被分成一组算法便终止。 先取一个小于n的整数d1作为第一个增量把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序然后取第二个增量d2d1重复上述的分组和排序直至所取的增量  1(    …d2d1)即所有记录放在同一组中进行直接插入排序为止。 
来看一个具体的过程 按照一个增量分段addn/2 n10 5,2,1 7 8 9 0 4 3 1 2 5 10 我们取的这个增量分别就是5 2 1 7 8 9 0 4 3 1 2 5 10:分出来的数组元素都是一样的 完成一次排序 3 1 2 0 4 7 8 9 5 3 2 4 8 5取增量为2的分为一组了 最后一次我们就取增量为1的分组 就是一个完整的序列但是时间复杂度还是On^2 七归并排序 核心思想递归分治 主要分析时间复杂度nlogn package sort;import java.util.Arrays;public class MegrSort {public static void main(String[] args) {int data[]  { 9, 5, 6, 8, 0, 3, 7, 1 };//拆分megerSort(data, 0, data.length - 1);System.out.println(Arrays.toString(data));//JDK里面的排序源码}public static void megerSort(int data[], int left, int right) { // 数组的两端if (left  right) { // 相等了就表示只有一个数了 不用再拆了int mid  (left  right) / 2;//拆分从最左边到中间megerSort(data, left, mid);//拆分右边从中间1到最右边megerSort(data, mid  1, right);// 分完了 接下来就要进行合并也就是我们递归里面归的过程meger(data, left, mid, right);}}public static void meger(int data[], int left, int mid, int right) {int temp[]  new int[data.length];		//借助一个临时数组用来保存合并的数据int point1  left;		//表示的是左边的第一个数的位置int point2  mid  1;	//表示的是右边的第一个数的位置int loc  left;		//表示的是我们当前已经到了哪个位置了while(point1  mid  point2  right){if(data[point1]  data[point2]){temp[loc]  data[point1];point1  ;loc  ;}else{temp[loc]  data[point2];point2 ;loc  ;}}//接下来要干嘛呢合并排序完成 了吗while(point1  mid){temp[loc ]  data[point1 ];}while(point2  right){temp[loc ]  data[point2 ];}for(int i  left ; i  right ; i){data[i]  temp[i];}}
}这段代码实现了归并排序算法。归并排序是一种分治算法它将一个数组分成两个子数组分别对其进行递归排序然后将两个有序的子数组合并成一个有序的数组。 代码中的megerSort方法是归并排序的主要方法它接受一个数组和两个索引值作为参数表示需要排序的数组和需要排序的范围。如果左索引小于右索引则将数组分为两半分别对左半部分和右半部分进行递归调用megerSort方法。递归调用结束后再调用meger方法将两个有序的子数组合并成一个有序的数组。 meger方法创建了一个临时数组temp用来保存合并的结果。变量point1和point2分别表示左半部分和右半部分的起始位置。变量loc表示当前合并的位置。在循环中比较左右两个子数组的元素大小将较小的放入临时数组中并将对应的指针向后移动。循环结束后将剩余的元素依次放入临时数组中。最后将临时数组的元素复制回原数组的对应位置。 整个归并排序的过程是递归的每一次递归都会将数组分为两半直到只有一个元素为止。然后通过合并两个有序的子数组来实现整个数组的排序。最后通过递归调用megerSort方法将整个数组排序完成。