1.交换排序所谓交换就是对序列中的任意两个元素进行比较,根据比较结果交换它们在序列中的位置,从而达到目的排序。冒泡排序冒泡排序是一种简单的交换排序算法。以升序为例,其核心思想是:从第一个元素开始,比较相邻的两个元素。如果第一个大于第二个,则交换。当轮到下一组相邻元素时,进行同样的比较操作,然后再寻找下一组,直到没有相邻元素可以比较为止。这时候最后一个元素应该是最大的数。除了每次排序得到的最后一个元素外,其余元素重复上述步骤,直到没有一对元素可以比较。Java实现的冒泡排序如下}if(arr.length<2){返回;}整数温度=0;for(inti=0;iarr[j+1]){temp=arr[j];}等待}arr[j+1];arr[j+1]=温度;数组分为左右区间,左边小于中间的参考数,右边大于中间的参考数。然后左右两边做同样的操作,再拆分继续,直到每个区间只有一个数。比如现在我要对数组4,9,5,1,2,6进行排序,一般取前4个作为参考号。第一次排序的结果是:2,1,4,5,9,6,可能有人会觉得奇怪,交换2和1的位置就能满足条件,为什么2排在第一位呢?这个其实是由实际代码实现决定的,不影响后续操作。以4为分界点,分别对2、1、4和5、9、6进行排序,得到:1、2、4、5、9、6。不用管左边的1、2、4,并把5,9,6分成5和9,6,然后排序,到此为止结果为:1,2,4,5,6,9为什么快排序归到交换排序的范畴?因为元素的移动也是通过交换位置来实现的。算法的实现需要用到递归(拆分区间后对每个区间做同样的操作)。Java实现的快速排序如下开始];//记录需要排序的下标intlow=start;int高=结束;一个小于基数的数字while(low=stard){high--;数ARR[LOW]=Arr[High];//左边的数字小于基准数字。[高]=arr[低];}}//将标准值赋给下标重合的位置arr[low]=stard;//处理所有小数quickSort(arr,start,low);//处理所有大数numberquickSort(arr,low+1,end);}}2.插入排序插入排序是一种简单的排序方法。插入数字的顺序也是有序的。按照这种方法,插入所有元素,直到整个序列排序完毕。直接插入排序直接插入排序是插入排序的粗略实现。对于一个序列,选择一个下标,认为这个下标之前的元素是有序的。将下标处的元素插入到它之前的序列中。然后选择这个下标的下一个元素,继续重复操作。直到插入最后一个元素。我们通常从序列的第二个元素开始。Java实现的算法如下:publicvoidinsertSort(int[]arr){//遍历所有数for(inti=1;i=0&&arr[j]>temp;j--){//将前一个数字分配给下一个数字arr[j+1]=arr[j];1]=温度;}}}希尔排序在某些情况下,直接插入排序的效率极低。例如,在一个已经有序的升序数组中,此时插入一个小于最小值的数,意味着插入的数必须与数组的所有元素进行一次比较。我们需要改进直接插入排序。如何改进?如前所述,插入排序在对已经排序的数组进行操作时非常高效。所以我们可以先尝试把数组变成相对有序的数组,然后再做插入排序。希尔排序可以达到这个目的。希尔排序按一定的下标增量(步长)对序列进行分组,对每一组使用插入排序。随着增量(步长)减小直到达到1,算法结束并且整个序列变得有序。因此,希尔排序也称为收缩增量排序。一般来说,第一次取序列的一半作为增量,以后每次减半,直到增量为1。Java实现的算法如下:publicvoidshellSort(int[]arr){//gap为步长,每次减为原来的一半。for(intgap=arr.length/2;gap>0;gap/=2){//对每个组进行直接插入排序for(inti=0;i=0&&arr[k]>Temp;K-=Gap){Arr[K+Gap]=Arr[K];}ARR[K+Gap]=TEMP;}}}}3.选择排序选择排序是一种简单直观的排序算法首先在未排序的序列中找到最小(最大)的元素,存储在已排序序列的开头,然后继续寻找最小(最大)的元素从剩余的未排序元素中取出,然后将其放在已排序序列的末尾。依此类推,直到所有元素都排序完毕。简单选择排序是选择排序思想的暴力实现。每遍从一个未排序的区间中找到一个最小元素,并将其放在第一位,直到所有区间都有序为止。Java实现的算法如下:publicvoidselectSort(int[]arr){//遍历所有数字for(inti=0;iarr[max]){max=leftNode;}if(rightNodearr[max]){max=rightNode;}//交换位置if(max!=index){inttemp=arr[index];arr[索引]=arr[最大];arr[最大值]=温度;条件,所以需要调整子树maxHeap(arr,size,max);}}/***HeapSort*@paramarr待排序整型数组*/publicstaticvoidheapSort(int[]arr){//起始位置为最后一个非叶子节点,即的父节点最后一个节点intstart=(arr.length-1)/2;//调整到大顶堆for(inti=start;i>=0;i--){SortTools.maxHeap(arr,arr.length,i);}//先把数组中第0位的数和堆中的最后一个数交换,然后把前面的数当作一个大堆顶(inti=arr.length-1;i>0;i--){inttemp=arr[0];arr[0]=arr[i];arr[i]=温度;最大堆(arr,我,0);}}4.归并排序归并排序是一种基于归并操作的有效且稳定的排序算法。这个算法采用了分而治之的思想,是一个非常典型的应用。归并排序的思路是:将n个元素分成两个子序列,每个子序列包含n/2个元素。通过递归,两个子序列继续执行第一步,直到无法再分割为止。这时,每一层递归都有两个子序列再合并,作为有序子序列返回给上层,然后继续合并。全部完成后,得到一个有序的序列。关键在于两个子序列应该如何合并。假设两个子序列都是有序的,那么合并的步骤是:创建一个临时数组用于存放结果,其长度为合并后的两个子序列的长度设置两个指针,初始位置为两个排序后的起始位置sequence比较两个指针所指向的元素,选择比较小的元素放入临时数组,将指针移动到下一个位置重复步骤3,直到一个指针到达sequence的末尾,取出所有剩余的元素其他序列直接复制到归并序列的末尾,在Java中实现归并排序如下://用于存放合并后的临时数组int[]temp=newint[high-low+1];//记录第一个数组中需要遍历的下标inti=low;//记录第二个数组中需要遍历的下标intj=middle+1;//记录临时数组中存放的下标intindex=0;//遍历两个数组,取出小数,放入临时数组while(i<=middle&&j<=high){//第一个数组中的数据较小if(arr[i]<=arr[j]){//将较小的数据放入临时数组temp[index]=arr[i];//Next移动一个数字I++;}else{temp[index]=Arr[j];j++;}Index++;}//处理剩余数据while(i<=mide){tempx]=Arr[i];我++;索引++;}while(j<=high){temp[index]=arr[j];j++;索引++;}//将临时数组中的数据放回原数组for(intk=0;kmax){max=value;}}}}//计算最大位数intmaxLength=(max+"").length();//用于临时存储数据int[][]temp=newint[10][arr.length];//用于记录temp中对应下标存储的数字个数int[]counts=newint[10];//根据最大??长度确定比较次数for(inti=0,n=1;i