排序
插入类排序
直接插入排序
折半插入排序
希尔排序
package sort1;
public class InsertSort1 {
public static void main(String[] args) {
int[]nums={-1,1,2,3,4,5,0,9,8,7,6};
new InsertSort1().shellSort(nums,new int[]{7,3,1});
for (int i = 1; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
}
void insertSort(int[] nums){
for (int i = 2; i <nums.length ; i++) {
nums[0]=nums[i];
int j;
for (j = i-1; nums[0]<nums[j]; j--) {
nums[j+1]=nums[j];
}
nums[j+1]=nums[0];
}
}
void insertSortPlus(int[] nums){
for (int i = 2; i <nums.length ; i++) {
if(nums[i]<nums[i-1]){
nums[0]=nums[i];
int j;
for (j = i-1; nums[0]<nums[j]; j--) {
nums[j+1]=nums[j];
}
nums[j+1]=nums[0];
}
}
}
void biInsertSort(int []nums){
for (int i = 2; i <nums.length ; i++) {
if(nums[i]<nums[i-1]){
nums[0]=nums[i];
int low=1;
int high=i-1;
while (low<high){
int mid=(low+high)/2;
if(nums[0]<nums[mid]){
high=mid-1;
}else{
low=mid+1;
}
}
for (int j = i-1; j>=low; j--) {
nums[j+1]=nums[j];
}
nums[low]=nums[0];
}
}
}
void shellInsert(int[] nums,int dk){
for (int i = dk+1; i <nums.length ; i++) {
if(nums[i]<nums[i-1]){
nums[0]=nums[i];
int j;
for (j = i-dk; j>0&&nums[0]<nums[j]; j-=dk) {
nums[j+dk]=nums[j];
}
nums[j+dk]=nums[0];
}
}
}
void shellSort(int[] nums,int dlta[]){
int t=dlta.length;
for (int k=0;k<t;k++){
shellInsert(nums,dlta[k]);
}
}
}
交换类排序
冒泡排序
package sort;
public class SwapSort {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 0, 9, 8, 7, 6};
new SwapSort().bubbleSortPlus(nums);
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "\t");
}
}
public void swap(int [] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
public void bubbleSort(int[] nums){
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j <nums.length-1-i ; j++) {
if(nums[j]>nums[j+1]){
swap(nums,j,j+1);
}
}
}
}
public void bubbleSortPlus(int[] nums){
boolean flag=true;
for (int i = 0; i < nums.length&&flag; i++) {
flag=false;
for (int j = 0; j <nums.length-1-i ; j++) {
if(nums[j]>nums[j+1]){
swap(nums,j,j+1);
flag=true;
}
}
}
}
}
快速排序
package sort1;
public class QuickSort1 {
public static void main(String[] args) {
int[]nums={-1,1,2,3,4,5,0,9,8,7,6};
new QuickSort1().qkSort(nums,1, nums.length-1);
for (int i = 1; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
}
void qkSort(int[]nums,int low,int high){
int pos;
if (low<high){
pos=qkPass(nums, low,high);
qkSort(nums, low,pos-1);
qkSort(nums, pos+1,high);
}
}
int qkPass(int[] nums,int low,int high){
nums[0]=nums[low];
while(low<high){
while (low<high&&nums[high]>nums[0]) --high;
nums[low]=nums[high];
while (low<high&&nums[low]<nums[0]) ++low;
nums[high]=nums[low];
}
nums[low]=nums[0];
return low;
}
}
package sort;
public class QuickSort {
public static void main(String[] args) {
int[]nums={1,2,3,4,5,0,9,8,7,6};
new QuickSort().qkSort(nums,0, nums.length-1);
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
}
void qkSort(int[]nums,int low,int high){
int pos;
if (low<high){
pos=qkPass(nums, low,high);
qkSort(nums, low,pos-1);
qkSort(nums, pos+1,high);
}
}
int qkPass(int[] nums,int low,int high){
int tmp=nums[low];
while(low<high){
while (low<high&&nums[high]>tmp) --high;
nums[low]=nums[high];
while (low<high&&nums[low]<tmp) ++low;
nums[high]=nums[low];
}
nums[low]=tmp;
return low;
}
}
选择类排序
简单选择排序
package sort;
public class SelectSort {
public static void main(String[] args) {
int[]nums={1,2,3,4,5,0,9,8,7,6};
new SelectSort().selectSort(nums);
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
}
public void swap(int [] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
void selectSort(int[] nums){
for (int i = 0; i < nums.length; i++) {
int k=i;
for (int j = i+1; j <nums.length ; j++) {
if (nums[j]<nums[k]){
k=j;
}
}
if (k!=i){
swap(nums,i,k);
}
}
}
}
树形选择排序
堆排序
package sort1;
import sort.InsertSort;
public class HeapSort1 {
public static void main(String[] args) {
int max=Integer.MAX_VALUE;
int[]nums={max,46,12,33,72,68,19,80,33};
new HeapSort1().heapSort(nums);
for (int i = 1; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
}
void heapAdjust(int[] nums,int s,int m){
int t=nums[s];
for (int j=2*s;j<=m;j*=2){
if (j<m&&nums[j]>nums[j+1]){
j++;
}
if(t<=nums[j]){
break;
}
nums[s]=nums[j];
s=j;
}
nums[s]=t;
}
void createHeap(int [] nums){
int n=nums.length-1;
for (int i=n/2;i>=1;i--){
heapAdjust(nums,i,n);
}
}
void heapSort(int [] nums){
int n=nums.length-1;
createHeap(nums);
for (int i=n;i>=2;i--){
nums[0]=nums[1];
nums[1]=nums[i];
nums[i]=nums[0];
heapAdjust(nums,1,i-1);
}
}
}
归并类排序
二路归并排序
自然归并排序
package sort1;
public class MergeSort1 {
public static void main(String[] args) {
int[]nums={-1,1,2,3,4,5,0,9,8,7,6};
new MergeSort1().natureMergeSort(nums,nums.length);
for (int i = 1; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
}
void mergeSort(int [] nums,int[] copy,int left,int right){
int middle;
if(left<right){
middle=(left+right)/2;
mergeSort(nums,copy,left,middle);
mergeSort(nums,copy,middle+1,right);
merge(nums,copy,left,right,middle);
}
}
void merge(int[] nums,int[] copy,int left,int right,int middle){
int i,p1,p2;
for (i=left;i<=right;i++){
copy[i]=nums[i];
}
p1=left;
p2=middle+1;
i=left;
while(p1<=middle&&p2<=right){
if (copy[p1]<=copy[p2]){
nums[i]=copy[p1];
p1++;
} else{
nums[i]=copy[p2];
p2++;
}
i++;
}
while (p1<=middle){
nums[i]=copy[p1];
i++;
p1++;
}
while (p2<=middle){
nums[i]=copy[p2];
i++;
p2++;
}
}
void merge(int[]nums,int l,int m,int r){
int i=l,j=m+1,p=0,q;
int [] copy=new int[r-l+1];
while (i<=m&&j<=r){
if(nums[i]<=nums[j]){
copy[p++]=nums[i++];
}else {
copy[p++]=nums[j++];
}
}
if (i>m){
for (q = j; q <=r ; q++) {
copy[p++]=nums[q];
}
}else {
for (q=i;q<=m;q++){
copy[p++]=nums[q];
}
}
for (p=0,i=l;i<=r;p++,i++){
nums[i]=copy[p];
}
}
void natureMergeSort(int[] nums,int n){
int i,sum,low,mid,high;
while (true){
i=0;
sum=1;
while (i<n-1){
low=i;
while (i<n-1&&nums[i]<nums[i+1]){ i++; }
mid=i++;
while (i<n-1&&nums[i]<nums[i+1]){ i++; }
high=i++;
if (i<=n){
merge(nums,low,mid,high);
sum++;
}
}
if (sum==1) break;
}
}
}
分配类排序
多关键字排序
链式基数排序
外部排序
置换选择排序
多路归并外排序