首先,先用随机数生成一组长度为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");
}
控制台结果为:
第一行是随机生成的数组,第二行是桶排序后的数组。
注明:文中使用到的排序示意图均出自 菜鸟教程 其余为本人原创,觉得有所收获的话点个赞吧~