冒泡排序,选择排序,快速排序
- 冒泡排序和选择排序的思想比较简单这里直接上代码,大家自己看代码先理解,后面我再简要说一下这两个思想,着重要说的是最重要的快速排序(快排)
冒泡排序:这都是写好的静态方法,大家用直接复制黏贴,用类调方法就行,顺便写了一个遍历的方法。直接用就行。
public class BubbleSort {
public static void bubbleSort2(int[] arr) {
for(int x = 0 ; x < arr.length - 1 ; x++){
for(int y = 0 ; y < arr.length - 1 - x ; y++){
if(arr[y] > arr[y + 1]){
int temp = arr[y] ;
arr[y] = arr[y+1];
arr[y+1] = temp ;
}
}
}
//return arr;
}
public static void print(int[] arr){
System.out.print("[");
for(int x = 0 ; x < arr.length ; x++){
if(x == arr.length - 1){
System.out.println(arr[x] + "]");
}else {
System.out.print(arr[x] + ", ");
}
}
}
}
- 原理:相邻元素两两比较,大的往后放,每次比完后,最大值出现在最大索引处
选择排序:同上算法写好了,直接复制黏贴再类调用就行。
public class SelectSort {
public static void selectSort(int[] arr) {
for (int index = 0; index < arr.length - 1; index++) {
for (int x = 1 + index; x < arr.length; x++) {
if (arr[x] < arr[index]) {
int temp = arr[x];
arr[x] = arr[index];
arr[index] = temp;
}
}
}
//return arr;
}
public static void print(int[] arr){
System.out.print("[");
for(int x = 0 ; x < arr.length ; x++){
if(x == arr.length - 1){
System.out.println(arr[x] + "]");
}else {
System.out.print(arr[x] + ", ");
}
}
}
}
- 原理:从0索引开始,依次和后面的元素比较,小的往前面放发,第一次完毕最小值出现在最小索引处,依次类推。
快速排序
-
快速排序算法思想:
-
分治法:比大小,再分区
-
从数组中取出一个数,作为基准数。
-
分区:将比这个数大或等于的数全放到他的右边,小于他的数
全放到他的左边。 -
再对左右区间重复第二步,直到各区间只有一个数。
-
-
实现思路
- 挖坑填数
- 将基准数挖出形成第一个坑。
- 由后向前找比他小的数,找到后挖出此数填到前一个坑中。
- 由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中。
- 再重复执行2,3两步骤。
- 挖坑填数
public class QuickSort {
//start 默认是0
//end 是数组长度-1
public void quickSort(int[] arr, int start, int end) {
if (start < end) {
//获取分区索引
int index = getIndex(arr, start, end);
//对左右两个分区 再进行同样的步骤 ,即是递归调用
quickSort(arr, start, index - 1);//左半部分
quickSort(arr, index + 1, end);//右半部分
}
}
private int getIndex(int[] arr, int start, int end) {
int i = start;
int j = end;
//定义基准数
int x = arr[i];
//循环
while (i < j) {
//从右往左比较
while (i < j && arr[j] >= x) {
j--;
}
//从右往左找到比基准数小的数了后,填坑
if (i < j) {
//把这个数填到上一个坑位
arr[i] = arr[j];
//让 i++;
i++;
}
//从左往右找
while (i < j && arr[i] < x) {
i++;
}
// 找比基准数大的数,找到后填坑
if (i < j) {
arr[j] = arr[i];
j--;
}
}
//当上面的循环结束后把基准数填到最后一个坑位,也就一基准数为界,分成了左右两部分
arr[i] = x; //把基准数填进去
return i; //返回基准数所在位置的索引
}
public static void print(int[] arr){
System.out.print("[");
for(int x = 0 ; x < arr.length ; x++){
if(x == arr.length - 1){
System.out.println(arr[x] + "]");
}else {
System.out.print(arr[x] + ", ");
}
}
}
}