首页 > 代码库 > 三种简单的排序算法
三种简单的排序算法
排序算法总是分不清,借了本数据结构来专门看了一下
说一下分类,主要有五类,插入排序,交换排序,选择排序,基数排序和归并排序
今天中午看了一下插入排序中的直接插入排序,交换排序的冒泡排序,选择排序中的冒泡排序
1.插入排序
将数组分成两个部分,一个是有序,一个是无序。将无序的每个元素插入到有序中,一共需要n - 1趟,最后一个元素不用计算
每一趟将第1个元素即array[i]元前面的i个元素比较,如果比array[i]大则后移一个位置。这样找到第i个元素的位置,插入
2.冒泡排序
将相邻两个元素比较,后一个元素i + 1比前一个元素i大交换位置。这样每一趟下来最大的就沉到最后一个元素的位置了。
所以需要n - 1趟,中间考虑到有正序的时候,设置一个标志,如果没有交换说明已经是正序,不用在排序了。
具体细节代码中有说明
3.直接选择排序
每一次从数组中选一个最小值放到最前面
这样需要n - 1趟,平时比较喜欢用这个,简单,但是效率不高
Rec.java
1 package com.gxf.sort; 2 3 /** 4 * 将关键字封装一下 5 * @author xiangfei 6 * 7 */ 8 public class Rec { 9 int key;10 11 public Rec(int key){12 this.key = key;13 }14 public Rec(){15 16 }17 18 /**19 * 根据整型数组构造一个Rec[]数组20 * @param array21 * @return22 */23 public Rec[] getRecArray(int array[]){24 Rec rec[] = new Rec[array.length];25 for(int i = 0; i < array.length; i++){26 rec[i] = new Rec(array[i]);27 }28 29 return rec;30 }31 }
Sort.java
1 package com.gxf.sort; 2 3 /** 4 * 排序类 5 * 这里主要实现三类简单的排序算法 6 * 直接插入排序、交换排序和选择排序中的 7 * 直接插入排序、冒泡排序和直接选择排序 8 * @author xiangfei 9 *10 */11 public class Sort {12 /**13 * 直接插入排序算法14 * 将后面的元素插入到前面的有序队列中n - 1趟15 * 每一趟需要将比rec[i].key更大的元素后移,找出合适的位置16 * 这里第一个元素不放值,用于暂存17 * 开始将第一个元素作为有序队列18 * @param rec19 */20 public void insSort(Rec rec[]){21 //rec[0]不放值22 for(int i = 1; i < rec.length;i++){23 int value = http://www.mamicode.com/rec[i].key;//需要插入的元素24 rec[0].key = rec[i].key;//这里需要保存要插入的元素,后面移动元素会覆盖25 int j = i - 1;26 while(value < rec[j].key){//后移元素,找到比value小或者等于的27 rec[j + 1].key = rec[j].key;28 j--;//前移29 }//j为比rec[i]小或者等于的元素的位置30 rec[j + 1].key = rec[0].key;//插入,完成一趟插入31 }32 //排完序后第一个元素置为033 rec[0].key = 0;34 }35 36 /**37 * 冒泡排序38 * 每一趟比较两个相邻元素的大小,大的元素往后移动,最大的元素移动到最后39 * 这样最多需要n - 1趟40 * 如果有正序的则不用排序,需要设置一个标志位,表明是否有交换41 * @param rec42 */43 public void bubbSort(Rec rec[]){44 boolean flag_exchange = false;//默认没有交换45 //这里至少需要n - 1趟46 for(int i = 0; i < rec.length - 1; i++){47 flag_exchange = false;//重置标志位没有交换48 for(int j = 0; j < rec.length - i - 1; j++){//每一趟的排序,范围逐渐缩小49 if(rec[j].key > rec[j + 1].key){//前一个元素比后一个元素大,需要交换50 Rec temp = rec[j];51 rec[j] = rec[j + 1];52 rec[j + 1] = temp;//交换53 flag_exchange = true;//设置有交换54 } 55 }56 if(!flag_exchange)57 break;//没有交换,说明已经是正序,退出58 }59 }60 61 /**62 * 直接选择排序63 * 每次选出最小的放到最前面,需要n - 1趟64 * 每一趟从剩下的元素中选出最小的,放到最前面65 * @param rec66 */67 public void seleSort(Rec rec[]){68 //需要n - 1趟排序69 for(int i = 0; i < rec.length - 1;i++){70 int min = i;//最小值的下标,默认为第一个元素71 //从i ~ n - 1中找出最小的一个元素下标72 for(int j = i; j < rec.length; j++){73 if(rec[j].key < rec[min].key)74 min = j;//更新最小元素的下标75 }//找出最小元素的下标76 if(i != min){//如果最小元素不是第一个元素交换77 Rec temp = rec[min];78 rec[min] = rec[i];79 rec[i] = temp;80 }//交换完成81 }82 }83 84 /**85 * 这里用一个方法来show数组里面的内容,看一下排序是否正确86 * @param rec87 */88 public void showRec(Rec rec[]){89 for(int i = 0; i < rec.length; i++){90 System.out.print(rec[i].key + " ");91 }92 System.out.println();93 }94 95 }
Test.java
package com.gxf.sort;public class Test { public static void main(String args[]){ Sort sort = new Sort(); Rec rec = new Rec(); int array[] = new int[]{0, 32, 1, 34, 54, 5, 6}; Rec array_test[] = rec.getRecArray(array); System.out.println("直接插入排序:"); sort.showRec(array_test);//print org sort.insSort(array_test); sort.showRec(array_test);//print changed System.out.println("冒泡排序:"); //bubblesort array_test = rec.getRecArray(array); sort.showRec(array_test);//print org sort.bubbSort(array_test); sort.showRec(array_test);//print changed System.out.println("直接选择排序:"); //select array_test = rec.getRecArray(array); sort.showRec(array_test);//print org sort.seleSort(array_test); sort.showRec(array_test);//print changed }}
三种简单的排序算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。