- 希尔排序
在插入排序基础上添加分割点进行二次插排教插入排序效率高
public class xesort {
public static void main(String [] args){
int [] arr={5,4,2,9,0,15,11,7,6,8,10,3,1};
sort(arr);
print(arr);
}
// public static void sort(int [] arr ){
for(int gap=arr.length/2;gap>0;gap/=2) {//分间隔数组对半开始 arr.length/2-----1
for (int i = gap; i < arr.length; i++) {
for (int j = i; j > gap - 1; j -= gap) {//插入排序
if (arr[j] < arr[j - gap])
swap(arr, j, j - 1);
}
}
}
}'
public static void sort(int [] arr ){
int h=1;
while(h<arr.length/3){
h=h*3+1;
}
for(int gap=h;gap>0;gap=(gap-1)/3) {//分间隔数组对半开始 arr.length/2-----1
for (int i = gap; i < arr.length; i++) {
for (int j = i; j > gap - 1; j -= gap) {//插入排序
if (arr[j] < arr[j - gap])
swap(arr, j, j - 1);
}
}
}
}
static void swap(int [] arr,int i,int j){
int temp =arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
static void print(int []arr){
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]+"");
}
}
}
- 归并排序
分治法,先划分再次进行排序较为稳定
//归并排序 分治策略
public class gbsort {
public static void main(String [] args){
int []arr={1,4,7,8,3,6,9};
sort(arr,0,arr.length-1);
print(arr);
}
public static void sort(int [] arr,int left,int right){//递归
if(left == right) return;
//分成两半
int mid = left + (right-left)/2;
//左排序
sort(arr, left, mid);
//右排序
sort(arr,mid+1 ,right);
merge(arr,left,mid+1,right);
}
static void merge(int []arr, int leftptr, int rightptr, int rightbound){
//mind :中间点
int mid = rightptr-1;
int [] temp = new int[rightbound - leftptr + 1];
int i = leftptr;
int j = rightptr;
int k = 0;
while(i <= mid && j <= rightbound){
temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
}
while (i <= mid){
temp[k++] = arr[i++];
}
while(j <= rightbound){
temp[k++] = arr[j++];
}
// print(temp);
for(int m = 0 ; m<temp.length; m++){
arr[leftptr+m] = temp[m];
}
}
static void swap(int [] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
static void print(int [] arr){
for (int i=0;i<arr.length;i++) {
System.out.println(arr[i]+"");
}
}
}
- 快速排序
采用递归调用可采用任意值为基准分成左右各半边再对两边进行二次排序重复操作
//快速排序
public class quicklySort {
public static void main(String [] args){
int [] arr = {7,3,2,8,1,9,5,4,6,10,6};
System.out.println("排序前:");
print(arr);
sort(arr,0,arr.length-1);
System.out.println("排序后");
print(arr);
}
public static void sort(int [] arr ,int leftbound , int rightbound){
if(leftbound >=rightbound){
return;
}
int mid = partition(arr,leftbound,rightbound);
//递归调用排序左右两边
sort(arr,leftbound,mid-1);
sort(arr,mid+1,rightbound);
}
static int partition(int [] arr ,int leftbound , int rightbound){
int pivot = arr[rightbound];
int left = leftbound;
int right = rightbound-1;
while(left <= right){
while (left <= right && arr[left] <= pivot){
left++;
}
while(left <= right && arr[right] > pivot){
right--;
}
if(left < right){
swap(arr,left,right);
}
}
swap(arr,left,rightbound);
return left;
}
static void swap(int []arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
static void print(int [] arr){
for(int i = 0;i < arr.length; i++){
System.out.println(arr[i] + "");
}
}
}