本文已参与「新人创作礼」活动,一起开启掘金创作之路。
JAVA-算法大全
这学期老师把算法交完了,今天整理了一些最常用的算法,其实最主要的还是算法思想 算法思想有很多,业界公认的常用算法思想有8种,分别是枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟。当然8种只是一个大概的划分,是一个“仁者见仁、智者见智”的问题
1.快速排序算法
原理
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据通常选用数组的第一个数作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
- 设置两个变量i、j,排序开始的时候:i=0,j=N-1;
- 以第一个数组元素作为关键数据,赋值给key,即key=A[0];
- 从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]的值交换;
- 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换;
- 重复第3、4步,直到i==j;
- 3,4步中,没找到符合条件的值,即3中 A[ j ] 不小于key,4中 A[ i ]不大于key的时候改变 j、i 的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候 i,j 指针位置不变。另外,i== j这一过程一定正好是 i + 或 j - 完成的时候,此时令循环结束
排序演示
假设一开始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。
|此时ref=5,i=1,j=11,从后往前找,第一个比5小的数是x8=2,因此序列为:2 3 7 6 4 1 0 5 9 10 8 | |--|--| |此时i=1,j=8,从前往后找,第一个比5大的数是x3=7,因此序列为:2 3 5 6 4 1 0 7 9 10 8| |此时,i=3,j=8,从第8位往前找,第一个比5小的数是x7=0,因此:2 3 0 6 4 1 5 7 9 10 8| |此时,i=3,j=7,从第3位往后找,第一个比5大的数是x4=6,因此:2 3 0 5 4 1 6 7 9 10 8| | 此时,i=4,j=7,从第7位往前找,第一个比5小的数是x6=1,因此:2 3 0 1 4 5 6 7 9 10 8 | | 此时,i=4,j=6,从第4位往后找,直到第6位才有比5大的数,这时,i=j=6,ref成为一条分界线,它之前的数都比它小,之后的数都比它大,对于前后两部分数,可以采用同样的方法来排序|
代码展示
package test1;
/**
* @author 小徐同学
*
* 2022年04月02日
*/
public class First {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("hello,world!");
int[] a =new int[]{100,44,66,88,33,11,44,2};
System.out.println("未排序前的数据为:");
print(a);
System.out.println("排序后的结果为:");
sort(a,0,a.length-1);
print(a);
}
public static void print(int[] b){
for(int i = 0;i < b.length;i++){
System.out.println(b[i]);
}
System.out.println("");
}
//排序方法
static void sort(int[] a,int low,int high){
if(low>=high)
return;// low小于high ,则直接返回
if((high-low)==1){//如果只有两个数字,则直接进行比较
if(a[0]>a[1])
swap(a,0,1);
return;
}
int pivot = a[low];//取第一个数作为哨兵
int left = low + 1;//开始逐步进行交换,因为哨兵为第一个元素,所以进行第二个数进行开始与最右边的进行对比
int right = high;
while(left < right){
while(left < right && left <= high){//如果左小于右则一直循环 33 100,40,60,87,34,11,56,0
if (a[left]>pivot) //left =1 right=7
break;
left++;//左下标往右边走一点
}
//从右边开始找
while(left <= right&& right > low){//如果左大于右则一直循环
if(a[right]<=pivot)
break;
right--;//右下标往左走一点
}
if(left < right)//如果没有找完,则交换数字
swap(a,right,left);
}
swap(a,low,right);//交换哨兵,进行下一次快速排序
sort(a,low,right);
sort(a,right+1,high);
}
private static void swap(int[] array,int i,int j){
int temp;
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
结果为
2.直接排序算法
原理
**直接选择排序(Straight Select Sorting) 也是一种简单的排序方法,
它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1] ~ R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2] ~ R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。**
演示
演示
例如:给定n=8,数组R中的8个元素的排序码为(8,3,2,1,7,4,6,5),则直接选择排序的过程如下所示 由于不方便画出关联箭头 所以用 n -- n 表示 :
| 初始状态 | [ 8 3 2 1 7 4 6 5 ] 8 -- 1 |
|---|---|
| 第一次 | [ 1 3 2 8 7 4 6 5 ] 3 -- 2 |
| 第二次 | [ 1 2 3 8 7 4 6 5 ] 3 -- 3 |
| 第三次 | [ 1 2 3 8 7 4 6 5 ] 8 -- 4 |
| 第四次 | [ 1 2 3 4 7 8 6 5 ] 7 -- 5 |
| 第五次 | [ 1 2 3 4 5 8 6 7 ] 8 -- 6 |
| 第六次 | [ 1 2 3 4 5 6 8 7 ] 8 -- 7 |
| 第七次 | [ 1 2 3 4 5 6 7 8 ] 排序完成 |
代码演示
package test1;
import java.util.*;
/**
* @author 小徐同学
*
* 2022年04月02日
*/
public class Sort {
public static void main(String[] args) {
int array[] = new int[20];//定义数组的大小
array = new int[] { 5, 3, 7, 9, 23, 42, 12, 1 };
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[i] > array[j]) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
System.out.println(Arrays.toString(array));// 输出每次循环后排序所得的内容
}
System.out.println(Arrays.toString(array));// 输出最后的排序结果
}
}