冒泡排序
数组与数据结构紧密相关,数组的常用操作有:排序、查找、搜索。
例子1:数组中有元素5 4 7 9 3
public class HelloWorld {
public static void main(String[] args) {
int[] arr = { 5, 4, 7, 9, 3 };
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
那么看一下排序情况:
public class HelloWorld {
public static void main(String[] args) {
int[] arr = { 5, 4, 7, 9, 3 };
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第"+(i+1)+"次排序");
for (int k = 0; k < arr.length; k++) {
System.out.print(arr[k]+" ");
}
System.out.println();
}
}
}
从这个图中可以看出外层循环控制排序次数,内层控制每一次排序的序列,可以看出每一次排序就会有一个最大值出来,就像泡泡一样,每一次都冒泡, arr.length - i - 1这个呢,就是每一次排序都会出现最大值排在最后,比如说,第一趟出现1个,第二趟出现两个…,那么这出现的最大值下一趟排序就不要比较了,直接减去i。
快速排序(Quicksort)
1)、快速排序是对冒泡排序的改进
public class HelloWorld {
public static void main(String[] args) {
int []arr={7,5,85,8,5,9,3,4,5};
//调用方法,进行快速排序
QuickSort(arr, 0, arr.length-1);
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
//定义方法,用来进行快速排序
public static void QuickSort(int []arr,int left,int right){
/*
* 进行判断,如果左边索引比右边索引大,是不合法的,直接使用return结束这个方法
*/
if (left>right) {
return;
}
//定义变量保存基准数
int base=arr[left];
//定义变量i,指向最左边
int i=left;
//定义变量j,指向最右边
int j=right;
//当i与j不相遇的时候,在循环中检索
while(i!=j){
//先由j从右往左检索比基准数小的,如果检索到比基准数小的就停下
//如果检索到比基准数大的或者相等的,就继续检索
while(arr[j]>=base && i<j)
j--;//j从右往左移动
//i从左往右检索
while (arr[i]<=base && i<j)
i++;//i从左往右移动
//当i和j都停下的时候,然后交换i和j位置的元素
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
//当上面循环条件不成立,也就是i==j,会跳出这个循环,i和j相遇,就把交换基准数这个元素和相遇位置的元素
//把相遇位置的元素赋值给基准数这个位置的元素
arr[left]=arr[i];
//把基准数赋值给相遇位置的元素
arr[i]=base;
//基准数在这里就归为了,左边的数比它小,右边的数比它大
//递归调用自身,排基准数左边
QuickSort(arr, left, i-1);
//排基准数右边
QuickSort(arr, j+1, right);
}
}
2)、对于快速排序里面为什么是先从右边往左边排序,再从左往右,而不是先从左往右,再从右往左呢?
比如数组是:5,4,3,2,1 第一遍循环没问题,1和5交换,数组为 :1,4,3,2,5而第二遍循环就发生问题了,i左往右移动到4的位置,而j也从右往左运动到4的位置(i<j),然后交换就会出现,4,1,3,2,5,此时4比1大还在1的左边。
有时候想不出来一个排序或其它的立体图形,我一般看的这个网站,推荐一下:数据结构与算法的动态可视化