排序
定义
将一组任意顺序的数据,重新排列成关键字有序的序列。
分类
1、内部排序
排序过程在内存中完成。
(1)插入排序
(2)选择排序
(3)交换排序
(4)归并排序
(5)分配排序
2、外部排序
数据量比较大的时候需要借助外部资源来实现排序。
算法的 稳定性:
如果序列中有两个关键字相等,那么在排序之后这两个关键字的相对位置(谁前谁后)不变的话,就说这
个算法是稳定的。
直接插入排序
R[0]是监视哨
如果前i-1个关键字处于有序状态,那么将第r[i]插入到前面的顺序表中的适当位置,逐个将后面未排序的关
键字插入到前面的有序表当中。
基本思想
基于有序有序插入。
用监视哨来存放要插入的元素值。
对于一个要进行排序的序列,默认初始有序序列为1个数据。也就是这里的(49)。
当i=1时,只有一个数据,不需要比较。
每一趟排序的序列将增加一个元素。如果序列中有n个元素,那么最多进行n-1趟排序即可。
将要插入的数据,也就是监视哨中的数据和已经有序的序列的最后一个数据比较,倒着比较。
如果有序序列的最后一个数据小于要插入的元素的值,那么直接将要插入的数据存放在当前的位置即可。
否则的话将最后一个数据向后移一位。接着比较倒数第二个。
Java实现代码
package com.xingyun.paixu;
import java.util.Scanner;
/*
*
* 直接插入算法:在一个无序的序列中,默认将第一个元素作为一个有序集合,然后将当前有序集合的最后一个元素的下一个元素插入到这个集合当中
* 先将这个要插入的元素存放在数组0中。数组0也就是一个监视哨,用来存放要插入的元素的值的。
* 然后将监视哨的值和有序序列的最后一个数据比较,如果监视哨的值大的话,就将监视哨的值直接放在有序集合的后面即可。
* 否则的话,将有序集合的最后一个数据向后移动一位,接着再和倒数第二个数据进行比较。
*
* */
public class ZhiJieChaRu {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int s=11;
int[] stu=new int[s];
boolean bool=true;
System.out.println("请输入要排序的序列规模"+(s-1));
for(int i=1;i<stu.length;i++) {
stu[i]=input.nextInt();
}
System.out.println("开始!");
for(int j=2;j<stu.length;j++) {
int m=j;
//将要插入的元素存放在监视哨中
stu[0]=stu[m];
//将有序序列中的最后一个数据元素和监视哨的值进行比较,满足条件的话,将集合中最后一个元素的值向后移动一位。
//然后再和倒数第二个元素比较
while(stu[m-1]>stu[0]) {
stu[m]=stu[m-1];
m=m-1;
bool=false;
}
//如果结束while循环,说明找到了合适的位置,也就是下标为m的时候。直接将监视哨的值存放在此处即可。
if(!bool) {
stu[m]=stu[0];
}
}
System.out.println("排序好的数组为:");
for(int k=1;k<stu.length;k++) {
System.out.print(stu[k]+"\t");
}
}
}