首先,先用随机数生成一组长度为30的数组。
Random rand = new Random(); int[] arr = new int[30]; for (int i = 0; i < arr.length; i++) { arr[i] = rand.nextInt(100); } //遍历输出未排序的数组 for (int i : arr) { System.out.print(i+"\t"); } //输出数组后换行 System.out.println();1.冒泡排序 代码如下:
for (int i = 1,t; i < arr.length; i++) { for (int j = 0; j < arr.length-i; j++) { //数组内数值两两相比,得出一个最大值 if (arr[j]>arr[j+1]) { t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t; } } } //遍历输出排序后的数组 for (int i : arr) { System.out.print(i+"\t"); }控制台结果为: 第一行是随机生成的数组,第二行是冒泡排序后的数组。 2.选择排序 代码如下:
for (int i = 1,maxIx,maxValIx,t; i < arr.length; i++) { //假设最大值所在位置的数组下标为0 maxValIx = 0; //每次循环最大值应处位置的下标 maxIx = arr.length-i; for (int j = 1; j <= maxIx; j++) { if (arr[maxValIx]<arr[j]) { //最大值所在位置的数组下标后移 maxValIx = j; } } //最大值所在位置的数组下标 和 最大值应处位置的下标不相同 if (maxIx != maxValIx){ //两个下标所在位置的值互相交换 t = arr[maxIx]; arr[maxIx] = arr[maxValIx]; arr[maxValIx] = t; } } //遍历输出排序后的数组 for (int i : arr) { System.out.print(i+"\t"); }控制台结果为: 第一行是随机生成的数组,第二行是选择排序后的数组。 3.插入排序 代码如下:
for (int i = 1,t,j; i < arr.length; i++) { if (arr[i]>=arr[i-1]) continue; t = arr[i]; //在数值 t 所在的下标之前查找大于 t 的值 for (j = i-1; j>=0 && arr[j]>t; j--) { arr[j+1] = arr[j]; } //循环结束后,将 t 的值放到循环结束时下标的后一个位置 arr[j+1] = t; } //遍历输出排序后的数组 for (int i : arr) { System.out.print(i+"\t"); }控制台结果为: 第一行是随机生成的数组,第二行是插入排序后的数组。 4.希尔排序 代码如下:
//定义一个间距值,给数组分组 int step = arr.length,t; while ((step/=2)>=2){ for (int i = 0; i+step < arr.length; i++) { //分组内排序 if (arr[i]>arr[i+step]){ t = arr[i]; arr[i] = arr[i+step]; arr[i+step] = t; } } }//希尔排序结束 //最后用插入排序,完成整个数组的排序,此时的插入排序效率很高 for (int i = 1,j; i < arr.length; i++) { if (arr[i]>=arr[i-1]) continue; t = arr[i]; for (j = i-1; j>=0 && arr[j]>t; j--) { arr[j+1] = arr[j]; } arr[j+1] = t; } //遍历输出排序后的数组 for (int i : arr) { System.out.print(i+"\t"); }控制台结果为:
第一行是随机生成的数组,第二行是希尔排序后的数组。 5.桶排序 代码如下:
//定义常量U,分10个桶 final int U = 10; int[][] bucket = new int[U][arr.length]; int[] ixs = new int[30]; for (int i = 1,count,t;; i*=10) { count = 0; //遍历随机生成的数组 for (int j = 0; j < arr.length; j++) { //count用来控制循环结束 count = (t=arr[j]/i)>=1 ? ++count : count; //把生成的数组的值对应放到桶里 bucket[t%=U][ixs[t]++]=arr[j]; } //控制循环结束 if (count==0) break; //遍历桶里的数组 for (int j = 0,ix=0; j < bucket.length; j++) { for (int k = 0; k < ixs[j]; k++){ //把桶里的数组的值对应放回原数组里 arr[ix++] = bucket[j][k]; } } //每个桶里统计的存放的数值个数清零 for (int j = 0; j < ixs.length; j++) { ixs[j] = 0; } } //遍历输出排序后的数组 for (int i : arr) { System.out.print(i+"\t"); }控制台结果为: 第一行是随机生成的数组,第二行是桶排序后的数组。
注明:文中使用到的排序示意图均出自 菜鸟教程 其余为本人原创,觉得有所收获的话点个赞吧~