java排序二
来源:互联网 发布:北外网络学历费用 编辑:程序博客网 时间:2024/06/10 05:01
重新再再巩固了一遍排序,上次的排序整理也没有写全,但是上篇文章把思路给整理出来了,详细的想看的点击链接就好了
http://blog.csdn.net/anny_lin/article/details/47046191
下面是算法:
1.冒泡排序:
for(int i=0;i<a.length;i++){ for (int j = 1; j < a.length; j++) { int temp; if (a[j]<a[i]) { temp=a[j]; a[j]=a[i]; a[i]=temp; } }
2.选择排序:
/*** * 将i层循环每循环一次记录第一个元素的值(flag),然后再第二层循环中得到比flag小的元素的值,付给a[i];,并记录下下标loc,第二层循环完成后获得最小元素下标,将flag的值给予a[loc],完成交换* */for(int i=0;i<a.length;i++){ //记录循环第一个元素第一个 int flag=a[i]; //记录j层循环后最小元素的下标 int loc=i; for(int j=i+1;j<a.length;j++) { if (a[j]<a[i]) { a[i]=a[j]; loc=j; } } a[loc]=flag;}
3.插入排序:
将未排序的元素插入到已经排序完成的元素当中
for(int i=1;i<a.length;i++) { int temp=a[i]; int loc=i; for(int j=i-1;j>=0;j--) { //记得跟a[j]比较的是temp,假设你写成a[i]就错了,a[i]的值是会变的 if (a[j]>temp) { a[j+1]=a[j]; loc=j; } } a[loc]=temp; }
4.归并排序:
public static int[] sort(int[] nums, int low, int high) { int mid = (low + high) / 2; if (low < high) { // 左边 sort(nums, low, mid); // 右边 sort(nums, mid + 1, high); // 左右归并 merge(nums, low, mid, high); } return nums; } public static void merge(int[] nums, int low, int mid, int high) { int[] temp = new int[high - low + 1]; int i = low;// 左指针 int j = mid + 1;// 右指针 int k = 0; // 把较小的数先移到新数组中 while (i <= mid && j <= high) { if (nums[i] < nums[j]) { temp[k++] = nums[i++]; } else { temp[k++] = nums[j++]; } } // 把左边剩余的数移入数组 while (i <= mid) { temp[k++] = nums[i++]; } // 把右边边剩余的数移入数组 while (j <= high) { temp[k++] = nums[j++]; } // 把新数组中的数覆盖nums数组 for (int k2 = 0; k2 < temp.length; k2++) { nums[k2 + low] = temp[k2]; } }
5.希尔排序:
static void shellSort( int[] a ) { int group= a. length/2; int j; for(; group>=1; group/=2) { for( int i= group; i< a. length; i++) { int temp= a[ i]; for( j= i- group; j>=0&& a[ j]> temp; j-= group) { a[ j+ group]= a[ j]; } a[ j+ group]= temp; } } }}
6.快速排序
static void sortDemo(int[] a,int begin,int end){ if (begin<end) { int i=quick_sort(a, begin, end); sortDemo(a, begin, i-1); sortDemo(a, i+1, end); }}//进行基点的确定static int quick_sort(int[] a,int begin,int end){ int x=a[begin]; int j=end; int i=begin; boolean flag=true; while (i!=j) { if (flag) { //从右向左找到比x小的元素,进行填坑操作 for(;j>i;j--) { if (a[j]<x) { //填坑 a[i++]=a[j]; //只找一个数,break;跳出 flag=false; break; } } }else { //从左向右找到比x大的元素,进行填坑操作 for(;i<j;i++) { if (a[i]>x) { //填坑 a[j--]=a[i]; flag=true; break; } } } } a[i]=x; return i;}
7.堆排序:
//进行堆生成的关键步骤,即判断是否交换父节点与子节点的值 static void maxheap2(int[] a,int heapsize,int i) { //左节点 int left=2*i+1; //右节点 int right=2*i+2; //保存i的值 int large=i; if (left<heapsize&&a[left]>a[i]) { large=left; } //注意,进行比较的是a[right]>a[large],这样就能直接选出父节点下对应孩子节点最大的节点 if (right<heapsize&&a[right]>a[large]) { large=right; } if (large!=i) { //交换值 ArrayUtils.exchangeElements(a, i, large); //进行递归,直到生成堆为止 maxheap2(a, heapsize, large); } } //建立堆 static void bulidHeap(int[] a) { //从倒数第二排开始进行maxheap操作,当然从a.length-1开始也行,但是浪费不必要的时间 for (int i = a.length/2; i >=0; i--) { maxheap2(a, a.length, i); } } static void heapSort1(int[] a) { if (a.length<=1||a==null) { return; } bulidHeap(a); for (int i = a.length-1; i >=0; i--) { //将堆顶元素与最后一个元素交换,同时数组大小将堆大小减一 ArrayUtils.exchangeElements(a, 0, i); //重新生成堆 maxheap2(a, i, 0); } }
下面的过段时间给出,最近实习比较忙
8.基数排序:
来自百度百科
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
第一步
以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39
第二步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
第三步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。
package num;import java.util.Arrays;import javax.activation.MailcapCommandMap;public class Test { public static void main(String[] args) { int d=1; int[] data = {56, 22, 101, 43, 55, 14, 28, 65, 39, 81, 33, 132}; d=getMaxd(data); sort(data, d); System.out.println(Arrays.toString(data)); } public static void sort(int[] a,int d) { int k=0; int n=1; //表示依据哪一位数进行排序 int m=1; //数组第一维表示可能的余数为0-9 int[][] array=new int[10][a.length]; //save数组表示位数是i的数的个数 int[] save=new int[10]; while (m<=d) { //将数字依次放入0-9的桶中 for(int i=0;i<a.length;i++) { int lsd=(a[i]/n)%10; array[lsd][save[lsd]]=a[i]; save[lsd]++; } //重新排序 for (int i = 0; i < 10; i++) { //表示所代表的位数上的数组有值 if (save[i]!=0) for(int j=0;j<save[i];j++) { a[k]=array[i][j]; k++; } //进行清零操作 save[i]=0; } m++; k=0; n*=10; } } //获取数组中最大的位数 public static int getMaxd(int[] a) { int temp=a[0]; for(int i=0;i<a.length;i++) { if (temp<a[i]) { temp=a[i]; } } int d=0; while(temp>0) { temp/=10; d++; } return d; }}
9.计数排序:
public static void main(String[] args) { int d=1; int[] data = {2,4,2,5,10,21,32,12,11,21,32,11,22,33}; countingSort(data, 33); System.out.println(Arrays.toString(data)); } public static void countingSort(int[] a ,int k) { //k为最大的数 int[] temp=new int[k+1]; //依次将数字填入数组temp中,temp中的元素相当于排完顺序的 for(int i=0;i<a.length;i++) { temp[a[i]]++; } int x=0; for(int i=0;i<k+1;i++) { while(temp[i]>0) { a[x]=i; x++; temp[i]--; } } }
大功告成~
- Java排序二:选择排序
- java 排序二
- java排序二
- 希尔排序-Java<二>
- java(二)排序
- java排序算法之二插入排序
- Java排序算法(二):简单选择排序
- Java排序算法(二):堆排序
- java排序之选择排序(二)
- java排序算法(二):直接选择排序
- Java常用排序算法(二):选择排序
- 排序算法java 二 --基数排序、归并排序
- Java常见排序:(二)冒泡排序
- Java实现排序算法(二)
- JAVA排序(二) Comparator接口
- 排序总结二(java实现)
- 排序算法JAVA实现二
- Java内排序算法二
- ViewDragHelper实现QQ5.0侧滑并处理与ViewPager的滑动冲突
- Toast使用方法
- AJAX调用方式总结
- sleep()和wait()线程控制方法的区别
- Android 开源项目第一篇——个性化控件(View)篇
- java排序二
- 使用android不能分享资源的问题
- 排序算法-o(n)时间复杂度
- startActivityForResult用法详解
- [LeetCode]Sliding Window Maximum
- Spring---AOP(注解配置)
- Android触摸事件分发与响应
- Comparator排序集合
- iOS学习笔记(一)