十大经典排序算法 (一)
//交换数组中两元素位置
public static void swap(int[] arr,int i,int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
swap在下面排序算法中会用到,主要是省事。
冒泡排序
//冒泡排序
public static void bubble(int[] nums) {
int length=nums.length;
boolean flag;
for(int i=0;i<length;i++) {//排序的次数
flag=true;
for(int j=0;j<length-1-i;j++) {//参与排序的数据个数
if(nums[j]>nums[j+1]){
swap(nums,j,j+1);
flag=false;
}
}
if(flag){
break;
}
}
}
flag在一定程度上起到了优化的作用,如果排序一个有序数组【1,2,3,4,5,6】,这里只需要循环一次就退出排序;如果在一次排序中,没有发生值交换,就意味着这时数组已经有序。
选择排序
//选择排序
public static void sort(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;
}
}
swap(nums,i,minIndex);
}
}
插入排序
//插入排序
public static void selectSort(int[] nums){
for(int i=1;i<nums.length;i++) {
int temp=nums[i];
int j=i;
while(j>0&&temp<nums[j-1]){
nums[j]=nums[j-1];
j--;
}
if(i!=j){
nums[j]=temp;
}
}
}
希尔排序
//插入排序的改进版---希尔排序
public static void shell(int[] nums) {
int step=nums.length/2;
int temp;
while(step>0) {
for(int i=step;i<nums.length;i++){
temp=nums[i];
int j=i;
while(j>=step&&nums[j-step]>temp) {
nums[j]=nums[j-step];
j-=step;
}
nums[j]=temp;
}
step=step/2;
}
}
归并排序
//归并排序,先分后合, mergeSort分 ,merge合并
public static void mergeSort(int[] nums,int left,int right){
if(left==right) return ;
int mid=left+(right-left)/2;
mergeSort(nums,left,mid);
mergeSort(nums,mid+1,right);
merge(nums,left,mid,right);
}
private static void merge(int[] nums, int left, int mid, int right) {
int[] helper=new int[right-left+1];//辅助数组
int i=0;
int l=left;
int r=mid+1;
while(l<=mid&&r<=right) {
helper[i++] = nums[l]<nums[r]?nums[l++]:nums[r++];
}
while(l<=mid) {
helper[i++] = nums[l++];
}
while(r<=right) {
helper[i++] = nums[r++];
}
for(int j=0;j<helper.length;j++) {
nums[left+j]=helper[j];
}
}
最后,使用归并排序为数组排序,验证:
public static void main(String[] args) {
int[] nums={5,44,15,16,26,27,3,49,4,19,70,28};
mergeSort(nums,0,nums.length-1);
for(int num:nums){
System.out.print(num+" ");
}
}
