首页 > 代码库 > Java中的几种排序算法
Java中的几种排序算法
插入排序:自1开始,通过交换将i插入其左端的有序的数列中。 交换次数不确定,但比较次数较均衡。 比冒泡更优。
1 private static void charu(int x[], int off, int len) {2 for (int i = off; i < len + off; i++)3 for (int j = i; j > off && x[j - 1] > x[j]; j--)4 swap(x, j, j - 1);5 }
选择排序:与冒泡相似,每一趟找到自i到末端最小的数的index,然后与i交换 一趟只需一次交换,所以比冒泡快。
1 private static void xuanze(int x[], int off, int len) { 2 for (int i = off; i < len + off; i++) { 3 int min = i; 4 for (int j = min; j < len + off; j++) { 5 if (x[min] > x[j]) 6 min = j; 7 } 8 swap(x, i, min); 9 }10 }
冒泡排序:i从左至右,i定住时将自i到末端最小的数移至i处,完成一趟,以此类推直至i到最右端 通过不停交换完成,时间消耗较多。
1 private static void maopao(int x[], int off, int len) {2 for (int i = off; i < len + off - 1; i++) {3 for (int j = i; j < len + off; j++) {4 if (x[i] > x[j])5 swap(x, i, j);6 }7 }8 }
快速排序法:首先任意选取一个数据作为关键数据,然后将所有比它小的数都放到它前面, 所有比它大的数都放到它后面,这个过程称为一趟快速排序。之后递归。
算法: 1)i从左到右找比key大的,i移至此处;j从右到左找比key小的,j移至此处
2)若i<j则交换ij,重复1);否则,一趟完成
3)一趟完成之后i如果未到最右端,递归右端;j如果未到达最左端,递归左端 此算法可改进,请参详jdk源码。
1 private static void kuaisu(int x[], int off, int len) { 2 int m = off + (len >> 1); // 中位下标 3 int left = off;// 起始下标 4 int right = off + len - 1;// 结束下标 5 m = med3(x, left, m, right); 6 int key = x[m];// 取中间的那个作为关键数据 7 // System.out.println("key="+key); 8 int i = left; 9 int j = right;10 while (true) {11 while ((x[i] < key) && (i < right))12 // 从左到右找>=的13 i++;14 while ((x[j] > key) && (j > left))15 // 从右到左找<=的16 j--;17 if (i >= j) {18 break;// 一趟完成19 }20 swap(x, i, j);21 System.out.printf("swap %d %d:%s\n", i, j, Arrays.toString(x));22 }23 if (i < right)24 kuaisu(x, i + 1, right - i);25 if (j > left)26 kuaisu(x, left, j - left);27 }
求数值处于中间的下标:
1 private static int med3(int x[], int a, int b, int c) {2 return (x[a] < x[b] ? (x[b] < x[c] ? b : x[a] < x[c] ? c : a)3 : (x[b] > x[c] ? b : x[a] > x[c] ? c : a));4 }
在数组x中交换a b位置:
1 private static void swap(int x[], int a, int b) {2 int t = x[a];3 x[a] = x[b];4 x[b] = t;5 }
Java中的几种排序算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。