通过相邻数据交换达到排序目的
public static void maopao(int[] a){ int temp = 0; for (int i = 0; i < a.length-1; i++) { for (int j = i+1; j < a.length; j++) { if (a[i]>a[j]){ temp = a[i]; a[i]=a[j]; a[j]=temp; } } } for (int t:a ) { System.out.println(t); } }每一步都选取一个极值来重新排列,达成排序
从原始数据中选择一个最小的,跟第一个交换。从剩下的数据中选择一个最小的,跟第二个交换。。。。。。。重复上面的过程知道最后两个数据交换完成。 public static void xuanze(int[] a){ int temp=0; int index=0; for (int i = 0; i < a.length - 1; i++) { index =i; for (int j = i+1; j < a.length; j++) { if (a[j]<a[index]) index=j; //找到最小值的下标 } if (index!=i){ //将最小值和第i个数交换 temp = a[i]; a[i]=a[index]; a[index] = temp; } } for (int t:a) { System.out.println(t);通过对未排序的数据进行逐个插入到合适的位置来达到排序的目的
将数据的前两个进行比较排序。将第三个数与排好序的前两个数比较,插入到合适的位置。。。。。。。重复上面的过程知道最后一个数据插入到合适的位置。当数据在已有一定顺序的情况下,效率比较高。
public static void charu(int[] a){ int j=0,t=0; for ( int i = 1; i < a.length; i++) { t=a[i]; j=i-1; while (j>=0&&t<a[j]){ a[j+1]=a[j]; j--; } a[j+1]=t; } for (int q:a ) { System.out.println(q); } }通过多次比较和交换来实现
设一个分界值,可以是第一个,通过分界值将数据分为左右两部分将大于等于分界值的数据放在右边,小鱼分界值的放在左边。将左右两部分数据分别采用上面的方法排序。直到整个数组排序完成。 private static void kuaisu(int[] a, int left, int right) { int f,t; int rtemp,ltemp; ltemp = 0; rtemp=a.length-1; f = a[(left+right)/2]; while (ltemp<rtemp){ while (a[ltemp]<f){ ltemp++; } while (a[rtemp]>f){ rtemp--; } if (ltemp<=rtemp){ t = a[ltemp]; a[ltemp] = a[rtemp]; a[rtemp]=t; rtemp--; ltemp++; } } if (left<rtemp){ kuaisu(a,left,ltemp-1); } if (ltemp<right){ kuaisu(a,rtemp+1,right); } }包括构造对结构和对排序输出两个过程
public static void dui(int[] a) { int i, j, k; int t; int n = a.length; //堆排序 for (i = n / 2 - 1; i >= 0; i--) { while (2 * i + 1 < n) { j = 2 * i + 1; if ((j + 1) < n) { if (a[j] < a[j + 1]) j++; } if (a[i] < a[j]) { t = a[i]; a[i] = a[j]; a[j] = t; i = j; }else { break; } } } //堆输出 System.out.println("元数据构成的堆"); for (int aa:a ) { System.out.println(aa); } for (i=n-1;i>0;i--){ t=a[0]; a[0]=a[i]; a[i]=t; k=0; while (2*k+1<i){ j=2*k+1; if ((j+1)<i){ if (a[j]<a[j+1]){ j++; } } if (a[k]<a[j]){ t=a[k]; a[k]=a[j]; a[j]=t; k=j; }else { break; } } } System.out.println("结果"); for (int aa:a ) { System.out.println(aa); } }将多个有序数据合成一个有序数据。如果合成的数据只有两个数据,就叫二路合并。
//二路合并 public static void mergeOne(int[] a,int[] b,int n,int len){ int i,j,k,s,e; s=0; while (s+len<n){ e=s+2*len-1; if ((e>=n)){ e=n-1; } k=s; i=s; j=s+len; while (i<s+len&&j<=e){ if (a[i]<=a[j]){ b[k++]=a[i++]; }else { b[k++]=a[j++]; } } while (i<s+len){ b[k++]=a[i++]; } while (j<=e){ b[k++]=a[j++]; } s=e+1; } if (s<n){ for (;s<n;s++){ b[s]=a[s]; } } } public static void Hebing(int[] a,int n){ int h,count,len,f; count = 0; len=1; f=0; int[] p = new int[n]; while (len<n){ if (f==1){ mergeOne(p,a,n,len);//合并两个数组 }else { mergeOne(a,p,n,len);//合并两个数组 } len=len*2; f=1-f; count++; } if (f==1){ for (h=0;h<n;h++){ a[h]=p[h]; } } for (int aa:a ) { System.out.println(aa); } }