Java六种排序算法
来源:互联网 发布:中国进口粮食数据 编辑:程序博客网 时间:2024/06/08 10:52
一、建立顺序表节点的类
package sorts;public class RecordNode { private Comparable key; //关键字 private Object element; //数据元素 public Comparable getKey() {return key;}public void setKey(Comparable key) {this.key = key;}public Object getElement() {return element;}public void setElement(Object element) {this.element = element;}public RecordNode(Comparable key){this.key=key;}public RecordNode(Comparable key,Object element){this.key=key;this.element=element;}}
二、构建顺序表
public class SeqList { private RecordNode[] r; //顺序表记录结点数组 private int curlen; //顺序表长度,即记录个数 //顺序表的构造方法,构造一个存储空间容量为maxSize的顺序表 public SeqList(int maxSize){ this.r=new RecordNode[maxSize]; //为顺序表分配maxSize个存储单元 this.curlen=0; //置顺序表的当前长度为0 } public RecordNode[] getRecord(){ return r; } public void setRecord(RecordNode[] r){ this.r=r; } public int getCurlen(){ return curlen; }}
三、冒泡排序
基本思想:每两个相邻的数相互比较,如果前一个数比后一个数大就交换位置,第一轮可以得出最大数,第二轮可以得出第二大的数,以此类推。
public void bubbleSort(){ RecordNode temp; //辅助结点 boolean flag=true; for(int i=1;i<this.curlen&&flag;i++){ flag=false; for(int j=0;j<this.curlen-i;j++){ if(r[j].getKey().compareTo(r[j+1].getKey())>0){ temp=r[j]; r[j]=r[j+1]; r[j+1]=temp; flag=true; } } } }
四、快速排序
基本思想:一般选用第一个数作为支点。先从最后一个开始和支点比较,如果比支点大,则继续j--和支点比较,如果比支点小就和r[i]交换。交换后,就从左边第一个起,与支点比较,如果比支点小,则i++继续和支点比较,如果比支点大,就和r[j]相交换。一轮结束后,递归继续。
//1.一趟快速排序 public int Partition(int i,int j){ RecordNode pivot=r[i]; //第i个记录作为支点记录 while(i<j){ while(i<j&&pivot.getKey().compareTo(r[j].getKey())<=0){ j--; } if(i<j){ r[i]=r[j]; //将比支点记录关键字值小的记录向前移动 i++; } while(i<j&&pivot.getKey().compareTo(r[i].getKey())>0){ i++; } if(i<j){ r[j]=r[i]; //将比支点记录关键字值大的记录向后 移动 j--; } } r[i]=pivot; return i; } //2.采用递归形式进行快速排序 public void qSort(int low,int high){ if(low<high){ int pivotloc=Partition(low,high); qSort(low,pivotloc-1); qSort(pivotloc+1,high); } } public void quickSort(){ qSort(0,this.curlen-1); }
五、选择排序
基本思想:把最左边第一个的元素和右边的元素比较,左边的元素若较大,就相互交换位置。
//直接选择排序 public void selectSort(){ RecordNode temp; //辅助结点 for(int i=0;i<this.curlen-1;i++){ //n-1趟排序 int min=i; for(int j=i+1;j<this.curlen;j++){ if(r[j].getKey().compareTo(r[min].getKey())<0){ min=j; } } if(min!=i){ temp=r[i]; r[i]=r[min]; r[min]=temp; } } }
六、堆排序
//1.创建初始堆 public void sift(int low,int high){ int i=low; //子树的根节点 int j=2*i+1; //j为i结点的左孩子 RecordNode temp=r[i]; while(j<high){ //沿较小值孩子结点向下筛选 if(j<high-1&&r[j].getKey().compareTo(r[j+1].getKey())>0){ j++; //j为左右孩子的较小者 } if(temp.getKey().compareTo(r[j].getKey())>0){ //若父母结点值较大,孩子结点中较小的值向上移 r[i]=r[j]; i=j; j=2*i+1; } else{ j=high+1; //退出循环 } } r[i]=temp; } //2.堆排序 public void heapSort(){ int n=this.curlen; RecordNode temp; for(int i=n/2-1;i>=0;i--){ //创建堆 sift(i,n); } for(int i=n-1;i>0;i--){ //每趟将最小关键字值交换到后面,再调整成堆 temp=r[0]; r[0]=r[i]; r[i]=temp; sift(0,i); } }
七、归并排序
//1.两个相邻有序序列的归并 public void merge(RecordNode[] r,RecordNode[] order,int h,int m,int t){ int i=h,j=m+1,k=h; while(i<=m&&j<=t){ //将r中两个相邻子序列归并到order中 if(r[i].getKey().compareTo(r[j].getKey())<=0){ //较小值复制到order中 order[k++]=r[i++]; } else{ order[k++]=r[j++]; } } while(i<=m){ //将前一个子序列剩余元素复制到order中 order[k++]=r[i++]; } while(j<=t){ //将后一个子序列剩余元素复制到order中 order[k++]=r[j++]; } } //2.一趟归并排序算法 public void mergepass(RecordNode[] r,RecordNode[] order,int s,int n){ int p=0; //p为每一对待组合并表的第一个元素的下标,初始值为0 while(p+2*s-1<=n-1){ //两两归并长度均为s的有序表 merge(r,order,p,p+s-1,p+2*s-1); p+=2*s; } if(p+s-1<n-1){ //归并最后两个长度不等的有序表 merge(r,order,p,p+s-1,n-1); } else{ for(int i=p;i<=n-1;i++){ //将剩余的有序表复制到order中 order[i]=r[i]; } } } //3.2-路归并排序 public void mergeSort(){ int s=1; //s为已排序的子序列长度,初始值为1 int n=this.curlen; RecordNode[] temp=new RecordNode[n]; //定义长度为n的辅助数组temp while(s<n){ mergepass(r,temp,s,n); //一趟归并,将r数组中各子序列归并到temp中 s*=2; //子序列长度加倍 mergepass(temp,r,s,n); //将temp数组中各子序列再归并到r中 s*=2; } }
八、插入排序
public void insertSort(){ RecordNode temp; int i,j; for(i=1;i<this.curlen;i++){ //n-1趟扫描 temp=r[i]; //将待插入的第i条记录暂存在temp中 for(j=i-1;j>=0&&temp.getKey().compareTo(r[j].getKey())<0;j--){ r[j+1]=r[j]; } r[j+1]=temp; } }
九、实例
package sorts;public class test {public static void main(String[] args) throws Exception{SeqList SL=new SeqList(20);RecordNode[] rd=new RecordNode[20];for(int i=0;i<rd.length;i++){rd[i]=new RecordNode((int)(Math.random() * 100));}SL.setRecord(rd);for(int j=0;j<rd.length;j++){ SL.insert(j,rd[j]);}//System.out.println("curlen="+SL.getCurlen());System.out.println("排序前:");for(int i=0;i<rd.length;i++){System.out.print(rd[i].getKey()+" ");}SL.bubbleSort();System.out.println(" ");System.out.println("冒泡排序后:");for(int i=0;i<rd.length;i++){System.out.print(rd[i].getKey()+" ");}SL.quickSort();System.out.println(" ");System.out.println("快速排序后:");for(int i=0;i<rd.length;i++){System.out.print(rd[i].getKey()+" ");}SL.selectSort();System.out.println(" ");System.out.println("选择排序后:");for(int i=0;i<rd.length;i++){System.out.print(rd[i].getKey()+" ");}SL.heapSort();System.out.println(" ");System.out.println("堆排序后:");for(int i=0;i<rd.length;i++){System.out.print(rd[i].getKey()+" ");}SL.mergeSort();System.out.println(" ");System.out.println("归并排序后:");for(int i=0;i<rd.length;i++){System.out.print(rd[i].getKey()+" ");}SL.insertSort();System.out.println(" ");System.out.println("插入排序后:");for(int i=0;i<rd.length;i++){System.out.print(rd[i].getKey()+" ");}}}十、运行结果
0 0
- Java六种排序算法
- 六种常见排序算法Java实现
- Java语言实现六种排序算法
- Java排序算法(六):归并排序
- 六种排序算法总结
- Java排序算法(六)--冒泡排序(交换排序)
- Java排序算法(六):直接插入排序
- Java排序算法总结(六):堆排序
- Java排序算法总结(六):堆排序
- Java排序算法总结(六):堆排序
- Java排序算法(六):直接插入排序
- Java排序算法(六):直接插入排序 .
- Java排序算法(六):直接插入排序
- 基于JAVA的排序算法之六--归并排序
- Java排序算法(六):折半插入排序
- 排序算法(六):JAVA实现快速排序
- 数据结构简单的六种排序算法
- C语言实现六种排序算法
- lr 录制脚本 打不开 IE浏览器
- 学习设计模式原则之依赖倒置原则,代码笔记
- jdk 1.7 安装 centos6.4-64位
- Boost源码学习十一[并发编程](3)
- mysql中的数据同步到elasticsearch
- Java六种排序算法
- 内核驱动中改写寄存器值
- apk打包中程序包R不存在的问题
- makefile编写
- ES6--Generator
- Ceph学习----Ceph性能测试
- myBatis 操作 mysql时,使用 like 关键进行模糊查询的方法
- 理财指南
- SSH免登陆