这个学期学习算法,大一学过C,现在忘了好多,写起来很别扭,所以用java实现,首先上归并排序。
import java.util.Scanner; /** * @author 段星星 * 归并排序算法 * */ public class MergeSort { /** * @param a 从键盘输入int数字,存入 * @param left 数组中待排序的部分的最左下标 * @param right 数组中待排序的部分的最右下标 */ public static void mergeSort(int[] a ,int left , int right){ if(left<right){ int i = (left+right)/2; mergeSort(a, left, i); mergeSort(a, i+1, right); int[] b = new int[a.length]; merge(a,b,left,i,right); copy(a,b,left,right); } } /** * @param a 待排序的数组 * @param b 临时数组 * @param left 数组中待排序的部分的最左下标 * @param right 数组中待排序的部分的最右下标 */ private static void copy(int[] a, int[] b, int left, int right) { for(int i=0; i<b.length;i++){ a[i]=b[i]; } } /** * 合并两个已排序的子数组,按从小到大方式 */ private static void merge(int[] a, int[] b, int l, int m, int r) { int i = l, j = m+1,k=0; //从低位到高位依次比较两个数组,取出较小值放入b中 while((i<=m)&&(j<=r)){ if(a[i]<a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } //当有一方数组取完时 if(i>m){ for(int q=j; q<=r; q++) b[k++] = a[q++];} else { for(int q=i; q<=m; q++) b[k++] = a[q++]; } //把临时数组的未赋值部分用a数组赋值,以免不赋值部分等于0,等到赋值给a时丢失数据 for(int t=k;t<a.length;t++){ b[t]=a[t]; } } public static void main(String[] args) { //从键盘读入数据 Scanner sc = new Scanner(System.in); int[] a = new int[3]; int i =0; System.out.println("请输入要排序的int整数!"); while(sc.hasNext()){ a[i] = sc.nextInt(); i++; if(i>=3) break; } sc.close(); /*for(int j=0; j<a.length; j++){ System.out.println(a[j]); }*/ MergeSort.mergeSort(a, 0, 2); /*for(int aValue : a){ System.out.println(aValue); }*/ for(int j=0; j<a.length; j++){ System.out.println(a[j]); } } }