本人在读本科生,最近自学算法,从最基础的排序开始,以下是个人学习过程的笔记和代码,在此写出来与大家分享,共同学习,共同进步,如有错误还需大家指正。
排序算法
一、选择排序
算法思想:从下标为0的数开始,依次与下标为1、2、3、4…a.length-1的数为止,把最小的数放在第一个位置,然后从下标为1的数开始依此与下标为2、3、4、…a.length-1的数为止,把倒数第二小的数放在第二个位置,以此类推…
import java.util.Scanner;
public class selectArray {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n =sc.nextInt();
int [] a=new int[n];
for(int i=0;i<a.length;i++){ //j键盘输入一组数据
a[i]=sc.nextInt();
}
for(int j=0;j<a.length;j++){ //依次用前一个数与后一个数比较较小的放在第一个位置,一次下来最小的元素到了第一个位置
for(int i=j+1;i<a.length;i++){
if(a[j]>a[i]){
int temp;
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
for(int m=0;m<a.length;m++){ //打印输出
System.out.print(a[m]+" ");
}
}
}
二、冒泡排序
算法思想: 用下标为0的元素与下标为1的元素比较,大的移到后边去,再用下标为1的元素与下标为2的元素比较大的放在后边,以此类推,经过一轮比较后最大的元素已经放在了最后边需要比较多少轮,看数组中元素的个数,一轮比较能确定一个数,剩下最后一个不用再进行了, 所以需要进行a.length-1轮(比如6个数就要进行5轮)
import java.util.Scanner;
public class maoPao {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//键盘键入数组元素个数
int [] a = new int[n]; //创建数组对象
for(int i=0;i<a.length;i++){ //循环给数组赋值
a[i]=sc.nextInt();
}
for(int j=0;j<a.length-1;j++){ //外层循环控制比较的轮数
for(int i=1;i<a.length-j;i++){ //内层循环控制每轮比较的次数,这一轮循环结束后,这一轮循环的最后一个数不再参与下一轮
int temp;
if(a[i-1]>a[i]){
temp=a[i];
a[i]=a[i-1];
a[i-1]=temp;
}
}
}
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
三、直接插入排序
算法思想:假设待排序的序列是两个部分(1 2 3|4 0 9 8) 左边的是一个有序序列,右边的是一个无序序列,然后依次将右边的序列的数插入到左边
import java.util.Scanner;
public class charuPaixu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt(); //输入数组元素的个数
int[] a = new int[n]; //new一个数组的对象
for(int i=0;i<a.length;i++){ //用循环给数组赋值
a[i]=sc.nextInt();
}
sort(a); //主方法调用排序方法
}
public static void sort(int []a){ //定义一个排序方法
int j; //定义一个指针
for(int i=1;i<a.length;i++){ //假设只有下标为0的元素是有序的 依次将下标为1,2,3...的元素往有序列表里插入
int temp=a[i]; //定义一个变量来存储a[i]的值 ,因为a[i]里存放的值会变动,先把需要排的第一个数的值存储起来
for(j=i-1;j>=0&&a[j]>temp;j--){ //a[i]插入进去的条件 1、数组不能越界 2、temp的值要比a[j]小
a[j+1]=a[j]; //交换位置
}
a[j+1]=temp; //确定要插入的数的位置
}
for(int m=0;m<a.length;m++){
System.out.print(a[m]+" "); //输出排好序的数组元素
}
}
}
四、希尔排序
算法思想----我们来看下希尔排序的基本步骤,在此我们选择增量gap=(low+high)/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k 趟排序;
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
import java.util.Scanner;
public class Shell {
public static void ShellSort(int []a,int low,int high){
int gap=(low+high)/2; //确定步长,步长以数组长度的一半
while (gap>0) { //步长要大于0
for (int i = gap; i < a.length; i++) { //分组
int temp=a[i]; //辅助空间
int preIndex=i-gap; //这一组的前一个数
while (preIndex>=0&&a[preIndex]>temp) { //交换的条件
a[preIndex+gap]=a[preIndex]; //交换位置
preIndex-=gap; //继续往前走
}
a[preIndex+gap]=temp; //确定位置
}
gap/=2; //步长减半
}
}
public static void main(String [] arg){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//键盘键入数组元素个数
int [] a = new int[n]; //创建数组对象
for(int i=0;i<a.length;i++){ //循环给数组赋值
a[i]=sc.nextInt();
}
Shell.ShellSort(a, 0,a.length-1);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
剩下的几种算法改天继续更新,以后我会不断地分享一些,我学习过程中的一些知识点,因为我主要是学习java以后会分享一些关于Java的基础知识以及一些算法,同时我也把写博客当作我学习的笔记和巩固知识点的方法。