冒泡排序
1、俩俩比较,大的放在后面,第一次排序后最大值已在数组末尾。
2、因为需要俩俩比较,需要n-1趟排序,比如10个数,需要9趟排序
3、两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数,每趟过后,比较的次数都应该要减1
4、如果一趟排序后没有发生位置交换,说明已经有序,不需要继续循环了
/**
* 冒泡排序
*
* @author kaifeng
*/
public class BubbleSort {
public static void main(String[] args) {
int[] arrays = {1, 8, 9, 3, 5, 6};
int isChange = -1;
for (int i = 0; i < arrays.length - 1; i++) {
isChange = 0;
for (int j = 0; j < arrays.length - i - 1; j++) {
int temp = 0;
if (arrays[j] > arrays[j + 1]) {
temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
isChange = 1;
}
}
if (isChange == 0) {
break;
}
}
System.out.println("冒泡排序结果:" + Arrays.toString(arrays));
}
}
选择排序
找到数组中最大的元素,与数组最后一位元素交换,
当只有一个数时,则不需要选择了,因此需要n-1趟排序,比如10个数,需要9趟排序
两个for循环,外层循环控制排序的趟数,内层循环找到当前趟数的最大值,随后与当前趟数组最后的一位元素交换
/**
* 选择排序
*
* @author kaifeng
*/
public class SelectSort {
public static void main(String[] args) {
int[] arrays = {1, 8, 9, 3, 5, 6};
int pos = 0;
for (int i = 0; i < arrays.length - 1; i++) {
int temp = 0;
pos = 0;
for (int j = 0; j < arrays.length - i; j++) {
if (arrays[j] > arrays[pos]) {
pos = j;
}
}
temp = arrays[pos];
arrays[pos] = arrays[arrays.length - 1 - i];
arrays[arrays.length - 1 - i] = temp;
}
System.out.println("选择排序结果:" + Arrays.toString(arrays));
}
}
插入排序
将一个元素插入到已有序的数组中,在初始时未知是否存在有序的数据,因此将元素第一个元素看成是有序的
与有序的数组进行比较,比它大则直接放入,比它小则移动数组元素的位置,找到个合适的位置插入
当只有一个数时,则不需要插入了,因此需要n-1趟排序,比如10个数,需要9趟排序
一个for循环内嵌一个while循环实现,外层for循环控制需要排序的趟数,while循环找到合适的插入位置(并且插入的位置不能小于0)
/**
* @author kaifeng
*/
public class InsertSort {
public static void main(String[] args) {
int[] arrays = {1, 8, 9, 3, 5, 6};
int temp;
for (int i = 1; i < arrays.length; i++) {
temp = arrays[i];
int j = i - 1;
while (j >= 0 && arrays[j] > temp) {
arrays[j + 1] = arrays[j];
j--;
}
arrays[j + 1] = temp;
}
System.out.println("选择排序结果:" + Arrays.toString(arrays));
}
}
快速排序
在数组中找一个元素,比它小的放在节点的左边,比它大的放在节点右边。一趟下来,比节点小的在左边,比节点大的在右边。
/**
* 快速排序,使用递归实现
*
* @author kaifeng
*/
public class QuickSort {
public static void main(String[] args) {
int[] arrays = {1, 8, 9, 3, 5, 6};
quickSort(arrays, 0, arrays.length - 1);
System.out.println(Arrays.toString(arrays));
}
/**
* 快速排序
*
* @param arr 待排序数组
* @param first 指向数组第一个元素
* @param end 指向数组最后一个元素
*/
public static void quickSort(int[] arr, int first, int end) {
int i = first;
int j = end;
int pivot = arr[(first + end) / 2];
while (i <= j) {
while (pivot > arr[i]) {
i++;
}
while (pivot < arr[j]) {
j--;
}
if (i <= j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
if (first < j) {
quickSort(arr, first, j);
}
if (i < end) {
quickSort(arr, i, end);
}
}
}