算法中的排序

算法


一、算法基础

  • 时间复杂度:计算排序所花费的最大或者最少时间,以及平均花费时间

  • 空间复杂度:计算排序时所需要消耗的临时空间

二、内容

  • 冒泡排序

  • 选择排序

  • 插入排序

三、冒泡排序

算法思路:
1.比较相邻的元素,如果第一个比第二个大,就交换他们

int[] arr= {9,5,7,8,6,4,2,1,0,3};

for(intj=0 ; j<arr.length-1 ; j++){

if(arr[j] >arr[j+1]){

inttemp=arr[j];

arr[j] =arr[j+1];

arr[j+1] =temp;

}

}

结果:

[5, 7, 8, 6, 4, 2, 1, 0, 3, 9]

2.继续重复两两比较,直到n轮

//冒泡排序

int[] arr= {9,5,7,8,6,4,2,1,0,3};

//1.比较两个相邻的值,直到把最大或者最小的放到数组的一端

//2.经过n轮重复,将完成最后排序工作

for(inti=0 ; i<arr.length ; i++){

for(intj=0 ; j<arr.length-1 ; j++){

if(arr[j] >arr[j+1]){

inttemp=arr[j];

arr[j] =arr[j+1];

arr[j+1] =temp;

}

}

}

注意:只要不断的重复两两比较交换的行为,一定能完成排序
优化:
因为每一轮结束之后,最大的数值都会被移动到数组末尾,是故后续的比较不再需要重复比较已经排序完成的内容

publicclassBubbleSort {

publicstaticvoidmain(String[] args) {

//冒泡排序

int[] arr= { 9, 5, 7, 8, 6, 4, 2, 1, 0, 3 };

//1.比较两个相邻的值,直到把最大或者最小的放到数组的一端

//2.经过n轮重复,将完成最后排序工作

for (inti=0; i<arr.length; i++) {

for (intj=0; j<arr.length-i-1; j++) {

if (arr[j] >arr[j+1]) {

inttemp=arr[j];

arr[j] =arr[j+1];

arr[j+1] =temp;

}

}

}

System.out.println(Arrays.toString(arr));

}

}

四、选择排序

算法思路:

  1. 找到最小值所在的位置

  1. 要通过循环,不断更替最小值所在的位置

//选择排序

int[] arr= {9,5,7,8,6,4,2,1,0,3};

//1.找到最小的值所在的游标

intminIndex=0;

//2.循环替换最小值游标

for(inti=0 ; i<arr.length ; i++){

//3.最小值所在位置对应的值进行比较,如果比他小,则替换游标

if(arr[i] <arr[minIndex]){

minIndex=i;

}

}

System.out.println("minIndex:"+minIndex);

  1. 把最小值要放到末排序的数组的首位/末尾

//选择排序

int[] arr= {9,5,7,8,6,4,2,1,0,3};

//1.找到最小的值所在的游标

intminIndex=0;

//2.循环替换最小值游标

//3.找到未排序的数组的起始位置

inti=0;

for(intj=0 ; j<arr.length ; j++){

//3.最小值所在位置对应的值进行比较,如果比他小,则替换游标

if(arr[j] <arr[minIndex]){

minIndex=j;

}

}

System.out.println("minIndex:"+minIndex);

//开始交换位置

inttemp=arr[i];

arr[i] =arr[minIndex];

arr[minIndex] =temp;

System.out.println(Arrays.toString(arr));

结果:

minIndex:8

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

阶段性结论:
选择排序是一个不稳定的排序算法,一轮排序只换一次
重复以上步骤,直到完成最终排序

//选择排序

int[] arr= {9,5,7,8,6,4,2,1,0,3};

//1.找到最小的值所在的游标

//2.循环替换最小值游标

//3.找到未排序的数组的起始位置

//4.重复这个步骤,直到排序结束

for(inti=0 ; i<arr.length ; i++){//i用于记录未排序数组的起始位置,随着轮数增加,往后推

intminIndex=i;//最小值的游标位置初值,是随着i的变化而变化的

for(intj=i ; j<arr.length ; j++){//从i记录的未排序的起始位置开始

//3.最小值所在位置对应的值进行比较,如果比他小,则替换游标

if(arr[j] <arr[minIndex]){

minIndex=j;

}

}

inttemp=arr[i];

arr[i] =arr[minIndex];

arr[minIndex] =temp;

}

System.out.println(Arrays.toString(arr));

五、插入排序

算法思路:
从第2位开始倒序排列
只要前面比我大,我就和他换位置
除非前面没有数,否则我就不会停

//插入排序

int[] arr= {1,2,3,5,6,7,4};

for(intj=arr.length-1 ; j>0&&arr[j] <arr[j-1] ; j--){

inttemp=arr[j];

arr[j] =arr[j-1];

arr[j-1] =temp;

}

System.out.println(Arrays.toString(arr));

结果:

[1, 2, 3, 4, 5, 6, 7]

重复以上过程,直到排序完成

publicclassInsertSort {

publicstaticvoidmain(String[] args) {

//插入排序

int[] arr= {9,8,7,6,5,4,3,2,1,0};

for(inti=1 ; i<arr.length ; i++{

for(intj=i ; j>0&&arr[j] <arr[j-1] ; j--){

inttemp=arr[j];

arr[j] =arr[j-1];

arr[j-1] =temp;

}

}

System.out.println(Arrays.toString(arr));

}

}

六、作业

需求:一个系统《学生成绩管理系统》1.启动程序,控制台有一个选项列表2.学生学号和成绩要一一对应3.学生成绩录入后自然排序4.学号不可重复,重复学号录入成绩,成绩自然覆盖5.查看成绩是自然排序后的成绩列表

Scannerscanner=newScanner(System.in);

System.out.println("欢迎使用学生管理系统。。。。。");

String[] studentCodeArr=newString[0];

double[] studentScoreArr=newdouble[0];

booleanflag=true;

while(flag){

System.out.print("1.录入学生学号 2.录入学生成绩 3.查看学生成绩 4.退出");

intopt=scanner.nextInt();

switch(opt){

case1:

break;

case2:

break;

case3:

break;

case4:

flag=false;

System.out.println("欢迎再次使用!");

break;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值