publicstaticvoidbinarySort(int[] source){
System.out.println("origin:"+Arrays.toString(source));
int mid,low,high;for(int i =1; i < source.length; i++){//折半查找应该插入的位置
low =0; high = i-1;while(low <= high){
mid =(low + high)/2;if(source[mid]> source[i]){
high = mid -1;}else{
low = mid +1;}}//统一移动元素,然后将这个元素插入到正确的位置
int temp = source[i];for(int j = i; j > high+1; j--){
source[j]= source[j-1];}
source[high+1]= temp;}
System.out.println("sorted:"+Arrays.toString(source));}
希尔排序
publicstaticvoidshellSort(int[] source){
System.out.println("origin:"+Arrays.toString(source));
int len = source.length;//按照缩小增量依次按照dk/2进行切割序列,直至增量为1for(int dk = len/2; dk >=1; dk = dk/2){
int temp;//循环遍历本次增量划分的区间子序列for(int i = dk; i < len; i++){if(source[i]< source[i-dk]){
temp = source[i];
int j;//对本次划分的序列进行排序--直接出入排序算法for(j = i-dk; j >=0&& temp < source[j]; j-=dk){
source[j+dk]= source[j];}
source[j+dk]= temp;}}}
System.out.println("sorted:"+Arrays.toString(source));}
冒泡排序
publicstaticvoidbubbleSort(int[] source){
System.out.println("origin:"+Arrays.toString(source));//冒泡排序趟数for(int i =0; i < source.length; i++){
boolean flag =false;/*本趟排序是否发生交换的标志*/
int temp;for(int j = source.length-1; j > i; j--){if(source[j]< source[j-1]){
temp = source[j];
source[j]= source[j-1];
source[j-1]= temp;
flag =true;}}if(!flag){
System.out.println("sorted:"+Arrays.toString(source));return;}}}
快速排序
publicstaticvoidquickSort(int[] source,int low,int high){if(low < high){
int p =partition(source, low, high);quickSort(source,low,p-1);quickSort(source,p+1,high);}}/**
* 快排的分治策略
*/privatestatic int partition(int[] source,int low,int high){
int pivot = source[low];//base valuewhile(low < high){while(low < high && source[high]>= pivot) high--;
source[low]= source[high];while(low < high && source[low]<= pivot) low++;
source[high]= source[low];}
source[low]= pivot;
System.out.println("sorted:"+Arrays.toString(source));return low;}
简单选择排序
publicstaticvoidselectSort(int[] source){
System.out.println("origin:"+Arrays.toString(source));for(int i =0; i < source.length; i++){
int min = i;//min存放最小元素的下标//每轮遍历找出本轮遍历的最小值for(int j = i+1; j < source.length; j++){if(source[j]< source[min]){
min = j;}}//最小下标不是i,则j与第i个位置交换
int swap;if(min != i){
swap = source[i];
source[i]= source[min];
source[min]= swap;}}
System.out.println("sorted:"+Arrays.toString(source));}
堆排序
publicstaticvoidheapSort(int[] source){
System.out.println("origin:"+Arrays.toString(source));
int len = source.length-1;for(int i = len/2; i >0; i--){adjustDown(source,i,len);}}/**
* adjust down to heap
*/publicstaticvoidadjustDown(int[] source, int index, int len){//step1.暂存当前元素节点
int temp = source[index];//step2.沿当前节点向下遍历自己的子节点,i为动态指针for(int i = index*2; i <= len; i *=2){//比较子节点左右节点关键子字的大小,如果右孩子关键字大于左孩子关键字,指针指向其大孩子的索引处if(i<len &&(source[i]< source[i+1])){
i++;//指针移动到右孩子的位置处}//比较父节点关键字与子节点关键字大小,如果父节点比子节点较大元素还大,则结束当次比较if(temp > source[i]){break;//删选结束//比较父节点关键字与子节点关键字大小,如果父节点比子节点较大元素小,则交换父节点关键字与其位置,修改节点索引,沿该节点继续向下找}else{
temp = source[i];
index = i;}}//step3.把最大的元素给当前父节点
source[index]= temp;}