java实现冒泡,选择,插入,快速排序

来源:互联网 发布:pdf页面合并软件 编辑:程序博客网 时间:2024/05/23 12:48
import java.util.Arrays;public class ArraysSort {public static void main(String[] args) {//在0-99范围内获取20个随机整数int[] data = getRandomArray(20,100);System.out.println("排序前:"+Arrays.toString(data));// bubble(data);// select(data);insert(data);//quick(data);System.out.println("排序后:"+Arrays.toString(data));System.out.println("是否有序:"+isOrdered(data));}/** * 判断数组是否有序(从小到大) * @param data * @return */private static boolean isOrdered(int[] data){for(int i = 0 ;i<data.length - 1;i++){if(data[i] > data[i+1]){return false;}}return true;}/** * 得到长度为length的随机不重复数组 *  * @param length 要获取的数据长度  * @param scope要获取数据的范围[0-scope) * @return */public static int[] getRandomArray(int length,int scope) {if(length > scope){throw new RuntimeException("数据长度不能比数据范围大!");}int[] data = new int[length];Arrays.fill(data, Integer.MAX_VALUE);// 这样即就不会默认为0了// 存入0-99的随机不重复数for (int i = 0; i < data.length; i++) {int temp;do {temp = (int) (Math.random() * scope);} while (contain(data, temp));// 如果该数已经存在,则继续取data[i] = temp;}return data;}/** * 判断数组中是否包含key *  * @param data * @param key * @return */private static boolean contain(int[] data, int key) {// data默认为0(上面赋值为Integer.MAX_VALUE),当0跟0比较会错误的判断成包含for (int i = 0; i < data.length; i++) {if (data[i] == key)return true;}return false;}// 冒泡排序public static void bubble(int[] data) {//最后一次不用比for (int i = 0; i < data.length - 1; i++) {for (int j = 0; j < data.length - 1 - i; j++) {if (data[j] > data[j + 1]) {int temp = data[j];data[j] = data[j + 1];data[j + 1] = temp;}}}}// 选择排序public static void select(int[] data) {int min;//最后一个数不用排序for (int i = 0; i < data.length - 1; i++) {int k = i;min = data[i];for (int j = i; j < data.length; j++) {if (data[j] < min) {min = data[j];k = j;}}int temp = data[i];data[i] = data[k];data[k] = temp;}}// 插入排序public static void insert(int[] data) {// 第一个数不用动for (int i = 1; i < data.length; i++) {// 从第二个数开始,要比较的数for (int j = 0; j < i; j++) {// 被比较的数if(data[i] <data[0]){//插入在左边,第0到i-1的数移到iint temp = data[i];for (int k = i - 1; k >= j + 1; k--) {data[k + 1] = data[k];}data[0] = temp;}else if (data[i] >= data[j] && data[i] <= data[j + 1]) {// 插在中间(j+1的位置)int temp = data[i];for (int k = i - 1; k >= j + 1; k--) {// 将j+1到i-1整体后退到,i的位置data[k + 1] = data[k];}data[j + 1] = temp;} // else就不用动了}}}/** * 快速排序 * @param data */public static void quick(int[] data){quick(data, 0, data.length-1);}private static void quick(int[] data,int p,int r){if(p < r){//部分排序int q = partSort(data, p, r);//q为得到的中间值,此时左边的数 < data[p],右边的数 > data[p]//递归排序左边quick(data, 0, q-1);//递归排序右边quick(data, q+1, r);}}private static int partSort(int[] data,int p,int r){int i = p-1;for(int j = p ;j<=r-1;j++){//此时i+1记录着比data[r]大的数,是准备要换位置的,换掉位置之后(小的数倍换来)//即i又向前进一格,继续记录着i+1的大数的最左边的位置。这个位置到到达最后的//时候会跟data[r]key换掉,即现在进变成了左边是小于key的数,右边是大于key的数if(data[j] <= data[r]){i++;change(data,i,j);}}change(data, i+1, r);return i+1 ;}private static void change(int[] data,int x,int y ){if(x == y){//相同的不换,节约时间return ;}int temp = data[x];data[x] = data[y];data[y] = temp;}}

阅读全文
0 0
原创粉丝点击