2013.12.15
来源:互联网 发布:王克勤记者知乎 编辑:程序博客网 时间:2024/05/21 18:41
* 实现了基于插入排序&“三项取中”划分的快速排序;
* “三项取中”划分带来的好处:
1:一定程度上避免了基本有序源数组导致的快速排序性能劣化的情况;
2: low,center,high三个元素已经排好,故不用将low,high加入循环,一定程度上减少了比较次数;
3: 消除了循环内l<h的判断,因为不会出现一直low++/high--而出现的越界情况;
* 使用“三项取中”划分的快速排序不能处理只有2/3个元素的数组,并且对多数据排序的时候,小划分(~=3)要使用手动排序;
* 快速排序的效率 N*logN;
* 基数排序实际上的效率与快速排序相近都是N*logN,但是需要两倍于快速排序的空间;
* 实现了基于链表的基数排序。此排序中使用的栈有deleteFirst(),insertFirst()方法,较大的数后进入站,正向遍历栈组中的所有数据,会导致大数先出栈,所以应该反向遍历栈组并从后插入数组;
* 实现了基于pivot的中位数查找;
基于“三项取中”划分&小划分(9)插入排序的快速排序算法@java/DataStructure/unit7
import java.util.*;public class TestQuickSort2{ public static void main(String [] args){ Random rand=new Random(47); int [] iArr=new int [100]; for(int i=0; i<100; i++) iArr[i]=rand.nextInt(100); System.out.println(Arrays.toString(iArr)); quickSort(0, iArr.length-1, iArr); System.out.println(Arrays.toString(iArr)); } public static int partition(int low, int high, int [] iArr){ int l=low+1, h=high-1, c=(low+high)/2, pivot=c, t; if(iArr[low]>iArr[c]){t=iArr[low]; iArr[low]=iArr[c]; iArr[c]=t;} if(iArr[c]>iArr[high]){t=iArr[c]; iArr[c]=iArr[high]; iArr[high]=t;} while(l<h){ while(iArr[h]>pivot){ h--; } iArr[l]=iArr[h]; while(iArr[l]<=pivot){ l++; } iArr[h]=iArr[l]; } iArr[l]=pivot; return l; } public static void insertSort(int low, int high, int [] iArr){ int t, j; for(int i=low+1; i<=high; i++){ if(iArr[i]<iArr[i-1]){ t=iArr[i]; j=i-1; for(; j>=0 && t<iArr[j]; j--) iArr[j+1]=iArr[j]; iArr[j+1]=t; } } } public static void quickSort(int low, int high, int [] iArr){ int size=high-low+1; if(size<10) insertSort(low, high, iArr); else{ int ptr=partition(low, high, iArr); quickSort(low, ptr-1, iArr); quickSort(ptr+1, high, iArr); } }}
基于链表的基数排序@java/DataStructure/unit7
import java.util.*;public class TestRadixSort{ public static void main(String [] args){ Random rand=new Random(47); int [] iArr=new int [100]; for(int i=0; i<iArr.length; i++) iArr[i]=rand.nextInt(1000); System.out.println(Arrays.toString(iArr)); radixSort(iArr, 3); System.out.println(Arrays.toString(iArr)); } public static void radixSort(int [] iArr, int digit){ int l=iArr.length, t=1; int [] tArr=new int [iArr.length]; LinkListX [] lArr=new LinkListX[10]; for(int i=0; i<10; i++) lArr[i]=new LinkListX(); for(int i=0; i<digit; i++){ for(int j=0; j<l; j++){ if(iArr[j]<t) lArr[0].insertFirst(iArr[j]); else lArr[(iArr[j]/t)%10].insertFirst(iArr[j]); } int k=l-1; for(int j=9; j>=0; j--){ while(!lArr[j].isEmpty()){ iArr[k--]=lArr[j].deleteFirst().iData; } } t*=10; } }}基于pivot的中位数查找@java/DataStructure/unit7
import java.util.*;public class TestCenterValue{ public static void main(String [] args){ Random rand=new Random(47); int [] iArr= new int [11]; for(int i=0; i<11; i++) iArr[i]=rand.nextInt(100); System.out.println(Arrays.toString(iArr)); findCenterValue(0, iArr.length-1, iArr); } public static int patition(int low, int high, int [] iArr){ int l=low, h=high, pivot=iArr[low]; while(l<h){ while(l<h && iArr[h]>pivot){ h--; } iArr[l]=iArr[h]; while(l<h && iArr[l]<=pivot){ l++; } iArr[h]=iArr[l]; } iArr[l]=pivot; return l; } public static void findCenterValue(int low, int high, int [] iArr){ int p=patition(low, high, iArr); if(iArr.length/2==p){System.out.println("The Center Value is "+iArr[p]); return;} else if(p>iArr.length) findCenterValue(low, p-1, iArr); else findCenterValue(p+1, high, iArr); }}
0 0
- 2013.12.15
- 2013.12.15
- 2013.12
- JSP学习1——web发展史(2013.12.15)
- 2013.12.01
- 2013.12.02
- 2013.12.03
- 2013.12.05
- 2013.12.06
- 2013.12.07
- 2013.12.08
- 2013.12.09
- 2013.12.10
- 2013.12.10
- 2013.12.11
- 2013.12.11
- 2013.12.12
- 2013.12.13
- 二见钟情之组合查询(vb.net版)
- UIPro 实例讲解一 商业级手机快速检测平台
- IOS中如何限制TextField中输入的类型以及长度
- Windows Server 2003 安装程序无法复制文件 scrdenrl.dl_
- php ltrim() rtrim() trim()删除字符空格
- 2013.12.15
- sql语句之join
- VC 设置开机自动运行
- WMI--Windows API--ConnectServer
- php检测数组长度的函数sizeof count
- 横向ListView
- eclpise使用笔记
- 最大公约数&最小公倍数探讨
- php常用的函数