常用Java排序算法详解
一、选择排序(SelectSort)
基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二次比较,得到最小的记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个为止。
publicclassSelectSort{ publicstaticvoidselectSort(int[]array){ inti; intj; inttemp; intflag; for(i=0;i<array.length;i++){ temp=array[i]; flag=i; for(j=i+1;j<array.length;j++){ if(array[j]<temp){ temp=array[j]; flag=j; } } if(flag!=i){ array[flag]=array[i]; array[i]=temp; } } } publicstaticvoidmain(String[]args){ int[]a={5,1,9,6,7,2,8,4,3}; selectSort(a); for(inti=0;i<a.length;i++){ System.out.print(a[i]+""); } } }
二、插入排序(InsertSort)
基本原理:对于给定的一组数据,初始时假设第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列中为止。
publicclassInsertSort{ publicstaticvoidinsertSort(int[]a){ if(a!=null){ for(inti=1;i<a.length;i++){ inttemp=a[i]; intj=i; if(a[j-1]>temp){ while(j>=1&&a[j-1]>temp){ a[j]=a[j-1]; j--; } } a[j]=temp; } } } publicstaticvoidmain(String[]args){ int[]a={5,1,7,2,8,4,3,9,6}; //int[]a=null; insertSort(a); for(inti=0;i<a.length;i++){ System.out.print(a[i]+""); } } }
三、冒泡排序(BubbleSort)
基本原理:对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和换位后,n个记录中的最大记录将位于第n位;然后对前(n-1)个记录进行第二轮比较;重复该过程直到进行比较的记录只剩下一个为止。
publicclassBubbleSort{ publicstaticvoidbubbleSort(intarray[]){ inttemp=0; intn=array.length; for(inti=n-1;i>=0;i--){ for(intj=0;j<i;j++){ if(array[j]>array[j+1]){ temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } } publicstaticvoidmain(String[]args){ inta[]={45,1,21,17,69,99,32}; bubbleSort(a); for(inti=0;i<a.length;i++){ System.out.print(a[i]+""); } } }
四、归并排序(MergeSort)
基本原理:利用递归与分治技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成为越来越大的有序序列。对于给定的一组记录(假设共有n个记录),首先将每两个相邻的长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。
publicclassMergeSort{ publicstaticvoidmerge(intarray[],intp,intq,intr){ inti,j,k,n1,n2; n1=q-p+1; n2=r-q; int[]L=newint[n1]; int[]R=newint[n2]; for(i=0,k=p;i<n1;i++,k++) L[i]=array[k]; for(i=0,k=q+1;i<n2;i++,k++) R[i]=array[k]; for(k=p,i=0,j=0;i<n1&&j<n2;k++){ if(L[i]>R[j]){ array[k]=L[i]; i++; }else{ array[k]=R[j]; j++; } } if(i<n1){ for(j=i;j<n1;j++,k++) array[k]=L[j]; } if(j<n2){ for(i=j;i<n2;i++,k++){ array[k]=R[i]; } } } publicstaticvoidmergeSort(intarray[],intp,intr){ if(p<r){ intq=(p+r)/2; mergeSort(array,p,q); mergeSort(array,q+1,r); merge(array,p,q,r); } } publicstaticvoidmain(String[]args){ inta[]={5,4,9,8,7,6,0,1,3,2}; mergeSort(a,0,a.length-1); for(intj=0;j<a.length;j++){ System.out.print(a[j]+""); } } }
五、快速排序(QuickSort)
基本原理:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。
publicclassQuickSort{ publicstaticvoidsort(intarray[],intlow,inthigh){ inti,j; intindex; if(low>=high) return; i=low; j=high; index=array[i]; while(i<j){ while(i<j&&index<=array[j]) j--; if(i<j) array[i++]=array[j]; while(i<j&&index>array[i]) i++; if(i<j) array[j--]=array[i]; } array[i]=index; sort(array,low,i-1); sort(array,i+1,high); } publicstaticvoidquickSort(intarray[]){ sort(array,0,array.length-1); } publicstaticvoidmain(String[]args){ inta[]={5,8,4,6,7,1,3,9,2}; quickSort(a); for(inti=0;i<a.length;i++){ System.out.print(a[i]+""); } } }
六、希尔排序(ShellSort)
基本原理:先将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对减少,然后对各个子序列分别进行直接插入排序,待整个待排序序列"基本有序后",最后再对所有元素进行一次直接插入排序。
publicclassShellSort{ publicstaticvoidshellSort(int[]a){ intlen=a.length; inti,j; inth; inttemp; for(h=len/2;h>0;h=h/2){ for(i=h;i<len;i++){ temp=a[i]; for(j=i-h;j>=0;j-=h){ if(temp<a[j]){ a[j+h]=a[j]; }else break; } a[j+h]=temp; } } } publicstaticvoidmain(String[]args){ inta[]={5,4,9,8,7,6,0,1,3,2}; shellSort(a); for(intj=0;j<a.length;j++){ System.out.print(a[j]+""); } } }
七、最小堆排序(MinHeapSort)
基本原理:对于给定的n个记录,初始时把这些记录看作一颗顺序存储的二叉树,然后将其调整为一个小顶堆,然后将堆的最后一个元素与堆顶元素进行交换后,堆的最后一个元素即为最小记录;接着讲前(n-1)个元素重新调整为一个小顶堆,再将堆顶元素与当前堆的最后一个元素进行交换后得到次小的记录,重复该过程直到调整的堆中只剩一个元素时为止,该元素即为最大记录,此时可得到一个有序序列。
publicclassMinHeapSort{ publicstaticvoidadjustMinHeap(int[]a,intpos,intlen){ inttemp; intchild; for(temp=a[pos];2*pos+1<=len;pos=child){ child=2*pos+1; if(child<len&&a[child]>a[child+1]) child++; if(a[child]<temp) a[pos]=a[child]; else break; } a[pos]=temp; } publicstaticvoidmyMinHeapSort(int[]array){ inti; intlen=array.length; for(i=len/2-1;i>=0;i--){ adjustMinHeap(array,i,len-1); } for(i=len-1;i>=0;i--){ inttmp=array[0]; array[0]=array[i]; array[i]=tmp; adjustMinHeap(array,0,i-1); } } publicstaticvoidmain(String[]args){ int[]a={5,4,9,8,7,6,0,1,3,2}; myMinHeapSort(a); for(inti=0;i<a.length;i++){ System.out.print(a[i]+""); } } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!