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的数移到i
int 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;
}
}
java实现冒泡,选择,插入,快速排序
最新推荐文章于 2021-08-17 17:16:37 发布
