-
冒泡排序
-
实现思路
-
代码实现
package sort;
import java.util.Arrays;
import java.util.Calendar;
public class BubbleSort {
static final int arrSize = 80000;
static long longStartTime = 0;
static long longEndTime = 0;
public static void main(String[] args) {
System.out.println("测试数据开始生成-------------->");
int arrSmall[] = {3, 9, -1, 10, -2};
int arrBig[] = new int[arrSize];
for (int i = 0; i < arrSize; i++) {
arrBig[i] = (int) (Math.random() * arrSize); //生成一个[0, 8000000) 数
}
System.out.println("小数据量测试开始-------------->");
bubbleSort(arrSmall);
System.out.println("小数据量顺序测试:" + Arrays.toString(arrSmall));
System.out.println();
longStartTime = Calendar.getInstance().getTimeInMillis();
System.out.println("大数量测试开始运行===========>");
//测试冒泡排序
bubbleSort(arrBig);
longEndTime = Calendar.getInstance().getTimeInMillis();
System.out.println(arrSize + "大数据量性能测试,花费的时间是:" + (longEndTime - longStartTime) / 1000 + "秒");
}
public static void bubbleSort(int[] arr) {
int temp = 0;
boolean flag = false;
//通过外层for语句的变换对内部for的循环条件做一个更改,从而达到我们数据改变的一个效果
for (int i = 0; i < arr.length - 1; i++) {
//走第一次内循环的时候,我们得排序是走到数组的最后一个元素的
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
//如果要是一遍冒泡走下来都没有交换过的话说明我们剩下的都也已经排序好了
if (!flag) {
break;
} else {
flag = false;
}
}
}
}
-
选择排序
-
实现思路
一趟循环中在还没有排序的元素中挑选出最大或是最小的元素依次放置到合适的位置。种思想类似于插队,所以每次交换的时候其他元素的位置根据是正序还是逆序,都会做相应的后移或是前移。
待插入的元素可以从两头和已排序序列中的元素作比较,同的选择对排序的效率是有影响的。从待排序相挨的那头排可以获得更高的效率,这样在比较的过过程中就可以实现元素的移位,这有点类似于冒泡,冒到恰当的位置为止。
-
代码实现
package sort;
import java.util.Arrays;
import java.util.Calendar;
public class InsertSort {
static final int arrSize = 80000;
static long longStartTime = 0;
static long longEndTime = 0;
public static void main(String[] args) {
System.out.println("测试数据开始生成-------------->");
int arrSmall[] = {3, 9, -1, 10, -2};
int arrBig[] = new int[arrSize];
for (int i = 0; i < arrSize; i++) {
arrBig[i] = (int) (Math.random() * arrSize); //生成一个[0, 8000000) 数
}
System.out.println("小数据量测试开始-------------->");
insertSortByWhile(arrSmall);
System.out.println("小数据量顺序测试:" + Arrays.toString(arrSmall));
System.out.println();
longStartTime = Calendar.getInstance().getTimeInMillis();
System.out.println("大数量测试开始运行===========>");
//测试冒泡排序
insertSortByWhile(arrBig);
longEndTime = Calendar.getInstance().getTimeInMillis();
System.out.println(arrSize + "大数据量性能测试,花费的时间是:" + (longEndTime - longStartTime) / 1000 + "秒");
}
//通过for循环的形式实现,元素是从前面开始的
public static void insertSortByFor(int[] arr){
//这里实现的思路是从前往后比较,得到确定的位置之后再进行位移
for (int i = 1; i < arr.length; i++) {
int temp =0;
for (int j = 0; j < i; j++) {
//arr[i]这个数小于了arr[j]的这个数,arr[i]要放在arr[j]
//先把arr[i]这个位置的数记录一下,随后把arr[j]以及之后的一段数据后移一位,腾出arr[j]的位置
if (arr[i]<arr[j]){
temp = arr[i];
for (int k = i;k > j ;k--){
arr[k] = arr[k-1];
}
arr[j] = temp;
}
}
}
}
//通过递归的方式实现,元素是从后面开始的
public static void insertSortByWhile(int[] arr){
//这里实现的思路是从后往前拍的,所以就可以直接通过while进行后移,相比for的操作
//可以看成是省去了比较的步骤
for (int i = 1; i < arr.length; i++) {
int insertVal = arr[i];
int insertIndex = i-1;
//利用&&的短路性质,合理的放置两个判断语句的先后循序,从而提高效率
while(insertVal<arr[insertIndex]&&insertIndex>=0){
arr[insertIndex+1] = arr[insertIndex];
insertIndex --;
}
//我的待插入的数据从后面过来的,所以如果比较不成功,跳出while说明待插入的值
//应该要插入的位置是在于他比较的值得后面,所以这里应该加1
if(insertIndex+1!=i){
arr[insertIndex+1] = insertVal;
}
}
}
}