十大排序算法上(冒泡,选择,插入,快速,希尔)
作者:互联网
冒泡:
public int[] bubbleSort(int[] nums){
for (int i=0;i<nums.length-1;i++){
for (int j=0;j<nums.length-i-1;j++){
if (nums[j]>nums[j+1]){
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
return nums;
}
选择:
public int[] selectSort(int[] nums){
//选择排序的思想是每次选择一个最小的元素插入到最前面
for (int i=0;i<nums.length-1;i++){
int minIndex=i;
for (int j=i+1;j<nums.length;j++){
if (nums[j]<nums[minIndex]){
minIndex=j;
}
}//循环了一次数组,找到了最小的元素
int temp=nums[i];
nums[i]=nums[minIndex];
nums[minIndex]=temp;//把最小的元素和前边的元素进行交换
}
return nums;
}
插入:
for (int i=1;i<nums.length;i++){
int j=i;
int temp=nums[i];
while (j>0&&nums[j-1]>temp){
nums[j]=nums[j-1];
j--;
}
nums[j]=temp;
}
return nums;
快速:
public int[] quickSort(int[] nums,int left,int right){
if (right-left<=7){
insertSort(nums,left,right);
return nums;
}
int pIndex=partition(nums,left,right);
quickSort(nums,left,pIndex-1);
quickSort(nums,pIndex+1,right);
return nums;
}
private int partition(int[] nums, int left, int right) {
Random random=new Random();
int randomIndex=left+random.nextInt(right-left+1);
swap(nums,left,randomIndex);
int pivot=nums[left];
int lt=left+1;
int gt=right;
while (true){
while (lt<=right&&nums[lt]<pivot){
lt++;
}
while (gt>left&&nums[gt]>pivot){
gt--;
}
if (lt>=gt){
break;
}
swap(nums,lt,gt);
lt++;
gt--;
}
swap(nums,gt,left);
return gt;
}
private void swap(int[] nums, int left, int randomIndex) {
int temp=nums[left];
nums[left]=nums[randomIndex];
nums[randomIndex]=temp;
}
private void insertSort(int[] nums, int left, int right) {
for (int i=left+1;i<=right;i++){
int j=i;
int temp=nums[i];
while (j>0&&nums[j-1]>temp){
nums[j]=nums[j-1];
j--;
}
nums[j]=temp;
}
}
希尔:
public int[] xierSort(int[] nums){
int len=nums.length;
int h=1;
while (3*h+1<len){
h=3*h+1;
}
while (h>=1){
for (int i=h;i<len;i++){
int j=i;
int temp=nums[i];
while (j>=h&&nums[j-h]>temp){
nums[j]=nums[j-h];
j-=h;
}
nums[j]=temp;
}
h/=3;
}
return nums;
}
该博主的写法十分详细,配有动画演示,通俗易懂
标签:gt,temp,nums,int,希尔,冒泡,排序,left 来源: https://blog.csdn.net/qq_59539549/article/details/122800074