数据结构的基础笔记 文章目录1.数据排序1.1 简单排序1.2.1 冒泡排序1.2.2选择排序1.2.3插入排序1.2高级排序1.2.1希尔排序1.2.2归并排序1.2.2.1 递归快速排序1.数据排序1.1 简单排序Comparable接口1.2.1 冒泡排序是一种稳定排序方法!1.比较相邻的元素。如果前一个元素比后一个元素大就交换这两个元素的位置。2.对每一对相邻元素做同样的工作从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。在这里插入代码片packagecom.itheima;publicclasstest1{publicstaticvoidmain(String[]args){int[]arr{4,5,6,3,2,1};intidert;for(inti6;i0;i--){for(inti10;i15;i1){if(arr[i1]arr[i11]){idertarr[i1];arr[i1]arr[i11];arr[i11]idert;}}}for(inti0;iarr.length;i){System.out.print(arr[i]);}}}1.2.2选择排序是一种不稳定排序方法!选择排序是一个在一串数组里面,先定义索引0为最小值,然后就比较下一位与最小值的大小,如果下一位比最小值小的话,就像下一位数值赋为最小值,(更换最小值),一直比较到最后,将最小值按顺序填入首位,依次往下填入,1.2.3插入排序是一种稳定排序方法!插入排序里面,可以理解为一个正三角两个for循环,外循环用于选定未排序的第一个数字,倒叙的内循环用于将这个数字与已经排好顺序的数组进行比较,(注意我原本再内循环if语句中对两个数进行了换位,按照冒泡顺序进行操作了,但是这个是已经排好序的数组所以不能进行换位,只有在退出内循环时说明比大小已经完成了,当前的i值就是这个数的索引,再将其放入其中)在这里插入代码片packagecom.itheima;importjava.util.Arrays;publicclasstest4{publicstaticvoidmain(String[]args){intarr[]{4,3,2,10,12,1,5,6};inttemp;inti;for(intj1;jarr.length;j){temparr[j];for(ij;i0;i--){if(temparr[i-1]){arr[i]arr[i-1];}else{break;}}arr[i]temp;}System.out.println(Arrays.toString(arr));}}1.2高级排序1.2.1希尔排序是一种不稳定排序方法!高级排序语言,这个比较麻烦,首先定义了一个数组,然后定义了一个分组数(用来确定每组多少数),首先让J等于gap然后将索引为J的数字存入temp里面,作为临时存储地方,然后到了关键的地方,定义一个i,然后需要保证,igap并且分组后的数字小于前面的数字,就对其进行插入排序,将,前面的数存放到后面的地址里面,然后进行,i-gap让i转变为前面数的地址,然后将,原本最开始后面数的值存入,完成交换,以上是最内部循环,而中间循环则用于遍历将jgap后面的数字都进行分组式比大小交换,然后最外层,用于更改gap的值,用于划分每组的数据与分组,该排序方法 不好理解,底层理解不清楚在这里插入代码片importjava.util.Arrays;publicclasswerwe{publicstaticvoidmain(String[]args){int[]arr{4,5,6,3,2,1};for(intgaparr.length;gap0;gap/2){for(intjgap;jarr.length;j){inttemparr[j];inti;for(ij;igaptemparr[i-gap];i-gap){arr[i]arr[i-gap];}arr[i]temp;}}System.out.println(Arrays.toString(arr));}}1.2.2归并排序1.2.2.1 递归是一种稳定排序方法!递归排序,是一个利用一个方法在方法内调用本身方法的技术,利用一直调用本身方法,进行类似循环的操作,来求n的阶乘,但是要事先对其进行划定规范.在这里插入代码片packagecom.itheima;publicclasstest7{publicstaticvoidmain(String[]args){System.out.println(surtrt(5));}publicstaticintsurtrt(intn){if(n1){return1;}returnn*surtrt(n-1);}}快速排序是一种不稳定排序方法!快速排序运行速度超级快,首先定义start和end,然后定义递归的出口,然后定义基准数baseNumber,然后再while外循环里面定义start不等于end,再while内循环1里面,endstart||arr[end]baseNumber意思为,当arr[end]小于基准数锁定这个数利用break退出去,while内循环2 里面,end start|| arr[end]baseNumber意思为,当arr[start]大于基准数时,锁定利用break推出去,然后将锁定的两个数进行交换,当startend时将arr[i]与arr[start]进行交换,然后利用递归让分开的两个组分别调用quickSort方法,然后进入递归算法里面,当startend的时候,作为递归的结束入口,在这里插入代码片packagecom.itheima;importjava.util.Arrays;publicclasstest22{publicstaticvoidmain(String[]args){int[]arr{6,1,2,7,9,3,4,5,10,8};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}publicstaticvoidquickSort(int[]arr,inti,intj){intstarti;intendj;if(startend){return;}intbaseNumberarr[i];// 利用循环找要交换的数据while(start!end){while(true){if(endstart||arr[end]baseNumber){break;}end--;}while(true){if(endstart||arr[start]baseNumber){break;}start;}inttemparr[end];arr[end]arr[start];arr[start]temp;}inttemparr[i];arr[i]arr[start];arr[start]temp;quickSort(arr,i,start-1);quickSort(arr,start1,j);}}