java 算法关于冒泡法的3种排序(优化)
2018-03-17 15:44
274 查看
心得:算法源于代码但是更是代码的升华,起初是考虑优化代码,但是后期发现代码优化的一部分就是算法的优化,sql的优化,以及一些循环体的处理,但是了里面很重要的一部分就是算法的优化,在下面的例子中将会侧重讲解冒泡排序算法的几种不同优化升级,有瑕疵请指正!谢谢
冒泡法:就是对一组数据进行排序,排序的规则就是如果j-1>j所对应的数值的话,把他们的值进行对换,以此类推,从而使第一个数字最小,最后一个数字最大;
基础算法1:public static void bubbleSort(int [] a,int n){
int i,j;
// 表示n次排序过程
for(i=0;j<n;j++){
for(j=1;j<n-j;j++){
// 如果前面一个数字比后面一个数字的值大,调整顺序
if(a[j-1]>a[j]){
int temp;
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
}
这是一个传统算法,如果遇到一个数组的顺序是有序排列的,但是经过上面的算法,还是效率比较低的,所以想到了另外一种算法,比第一种算法就会效率大大提升;
基本算法2:/**
* 设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
* @param a
* @param n
*/
public static void bubbleSort2(int [] a, int n){
int j, k = n;
boolean flag = true;//发生了交换就为true, 没发生就为false,第一次判断时必须标志位true。
while (flag){
flag=false;//每次开始排序前,都设置flag为未排序过
for(j=1; j<k; j++){
if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换
//交换a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交换过数据;
flag = true;
}
}
k--;//减小一次排序的尾边界
}//end while
}//end算法二可以很好的解决数组是有序的或者是数组后面一部分是有序的,就不需要一直不停的排序,一定程度上也是提高了效率;
但是同时也面临一个问题就是,再进一步做优化。比如,现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字,那么在第一趟遍历后,最后发生交换的位置必定小于100,且这个位置之后的数据必定已经有序了,也就是这个位置以后的数据不需要再排序了,于是记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。如果是对于上面的冒泡排序算法2来说,虽然也只排序100次,但是前面的100次排序每次都要对后面的900个数据进行比较,而对于现在的排序算法3,只需要有一次比较后面的900个数据,之后就会设置尾边界,保证后面的900个数据不再被排序。public static void bubbleSort3(int [] a, int n){
int j , k;
int flag = n ;//flag来记录最后交换的位置,也就是排序的尾边界
while (flag > 0){//排序未结束标志
k = flag; //k 来记录遍历的尾边界
flag = 0;
for(j=1; j<k; j++){
if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换
//交换a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交换过数据;
flag = j;//记录最新的尾边界.
}
}
}
}
冒泡法:就是对一组数据进行排序,排序的规则就是如果j-1>j所对应的数值的话,把他们的值进行对换,以此类推,从而使第一个数字最小,最后一个数字最大;
基础算法1:public static void bubbleSort(int [] a,int n){
int i,j;
// 表示n次排序过程
for(i=0;j<n;j++){
for(j=1;j<n-j;j++){
// 如果前面一个数字比后面一个数字的值大,调整顺序
if(a[j-1]>a[j]){
int temp;
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
}
这是一个传统算法,如果遇到一个数组的顺序是有序排列的,但是经过上面的算法,还是效率比较低的,所以想到了另外一种算法,比第一种算法就会效率大大提升;
基本算法2:/**
* 设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
* @param a
* @param n
*/
public static void bubbleSort2(int [] a, int n){
int j, k = n;
boolean flag = true;//发生了交换就为true, 没发生就为false,第一次判断时必须标志位true。
while (flag){
flag=false;//每次开始排序前,都设置flag为未排序过
for(j=1; j<k; j++){
if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换
//交换a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交换过数据;
flag = true;
}
}
k--;//减小一次排序的尾边界
}//end while
}//end算法二可以很好的解决数组是有序的或者是数组后面一部分是有序的,就不需要一直不停的排序,一定程度上也是提高了效率;
但是同时也面临一个问题就是,再进一步做优化。比如,现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字,那么在第一趟遍历后,最后发生交换的位置必定小于100,且这个位置之后的数据必定已经有序了,也就是这个位置以后的数据不需要再排序了,于是记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。如果是对于上面的冒泡排序算法2来说,虽然也只排序100次,但是前面的100次排序每次都要对后面的900个数据进行比较,而对于现在的排序算法3,只需要有一次比较后面的900个数据,之后就会设置尾边界,保证后面的900个数据不再被排序。public static void bubbleSort3(int [] a, int n){
int j , k;
int flag = n ;//flag来记录最后交换的位置,也就是排序的尾边界
while (flag > 0){//排序未结束标志
k = flag; //k 来记录遍历的尾边界
flag = 0;
for(j=1; j<k; j++){
if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换
//交换a[j-1]和a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
//表示交换过数据;
flag = j;//记录最新的尾边界.
}
}
}
}
相关文章推荐
- 关于乘方的优化算法(java实现)
- [算法] 关于algs4 MSD.java 高位优先的字符串排序 的逐行代码解释
- 关于烙饼排序问题的算法与Java实现
- Java学习之数组1(1.数组的声明;2.元素为引用数据类型的数组;3.关于main方法里的String[] args;4.数组排序;5.数3退1 数组算法,(用数组模拟链表);6数组查找之二分法;7数组的拷贝)
- 关于算法优化理论。
- 基于迪克斯特拉(Dijkstra)算法的物流优化系统(Java语言)
- 关于路径搜索算法的实用性优化
- 关于数据库的一个统计算法的优化,欢迎大家来讨论(一定要赖心看的)
- 关于《射雕英雄传》的数学算法问题 JAVA实现
- 张敬写的关于排序的小程序(java)
- Java性能优化[4]:关于finalize函数
- JAVA中关于集合类的排序
- JAVA版位图排序(算法珠玑开篇的例子)
- 关于Java权限控制算法【转】
- Java关于排序
- 关于Java权限控制算法
- 计算名次与按名次排序问题的算法优化
- 关于google map api中的球平投影算法接口: GProjection和GMercatorProjection类 - tim-wu - BlogJava
- 关于java的数据结构和算法
- 设计及设计模式:关于Java权限控制算法