/*
直接插入排序
*/
public int[] InsertSort(int[] nums){
int n=nums.length;
for(int i=1;i<n;i++){
int j=i-1;
int num=nums[i];
while(j>=0&&num<nums[j]){
nums[j+1]=nums[j];
j--;
}
nums[j+1]=num;
}
return nums;
}
/*
Shell排序
*/
public int[] ShellSort(int[] nums){
int n=nums.length;
for(int d=n/2;d>0;d/=2){
for(int i=d;i<n;i++){
int j=i-d;
int num=nums[i];
while(j>=0&&nums[j]>num){
nums[j+d]=nums[j];
j-=d;
}
nums[j+d]=num;
}
}
return nums;
}
/*
Bubble排序
*/
public int[] BubbleSort(int[] nums){
int n=nums.length;
int bound=n-1;
while(bound!=-1){
int t=-1;//最后一次交换的下标
for(int j=0;j<bound;j++){
if(nums[j]>nums[j+1]){
int tmp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=tmp;
t=j;
}
}
bound=t;
}
return nums;
}
/*
快速排序
*/
private int partition(int[] nums,int left,int right){
int i=left;
int j=right+1;
int num=nums[left];
while(i<j){
i++;
while(i<=right&&nums[i]<=num){
i++;
}
j--;
while(nums[j]>num){
j--;
}
if(i<j){
int tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
}
nums[left]=nums[j];
nums[j]=num;
return j;
}
public int[] QuickSort(int[] nums,int left,int right){
if(left>=right){
return nums;
}
int j=partition(nums,left,right);
QuickSort(nums,left,j-1);
QuickSort(nums,j+1,right);
return nums;
}
/*
直接选择排序
*/
public int[] SelectSort(int[] nums){
int n=nums.length;
for(int i=n-1;i>=1;i--){
int t=0;//最大的下标
for(int j=1;j<=i;j++){
if(nums[j]>nums[t]){
t=j;
}
}
int tmp=nums[t];
nums[t]=nums[i];
nums[i]=tmp;
}
return nums;
}
/*
堆排序
*/
private void Restore(int[] nums,int root,int end){
int j=root;
while(2*j<end){//注意,不要使用j<=(end-1)/2
int m=0;
if(2*j+1<end&&nums[2*j+1]<nums[2*j+2]){
m=2*j+2;
}else{
m=2*j+1;
}
if(nums[m]<=nums[j]){
j=end;
}else{
int tmp=nums[m];
nums[m]=nums[j];
nums[j]=tmp;
j=m;
}
}
}
public int[] HeapSort(int[] nums){
int n=nums.length;
for(int root=(n-2)/2;root>=0;root--){
Restore(nums,root,n-1);
}
for(int i=n-1;i>=1;i--){
int tmp=nums[0];
nums[0]=nums[i];
nums[i]=tmp;
Restore(nums,0,i-1);
}
return nums;
}
/*合并排序*/
public void MergeSort(int[] nums,int left,int right){
if(left>=right){
return;
}
int mid=(left+right)>>1;
MergeSort(nums,left,mid);
MergeSort(nums,mid+1,right);
Merge(nums,left,mid+1,right);
}
private void Merge(int[] nums,int first,int second,int end){
int[] nums1=new int[second-first];
System.arraycopy(nums,first,nums1,0,second-first);
int i=0;
int j=second;
int k=first;
while(i<nums1.length&&j<=end){
if(nums1[i]<=nums[j]){
nums[k++]=nums1[i++];
}else{
nums[k++]=nums[j++];
}
}
while(i<nums1.length){
nums[k++]=nums1[i++];
}
}
各种排序方法
最新推荐文章于 2024-09-15 10:42:58 发布