前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >排序算法

排序算法

作者头像
晚上没宵夜
发布2022-05-09 21:07:05
1130
发布2022-05-09 21:07:05
举报

笔者埋坑后面再来分析总结

1. 插入排序

直接插入排序:O(n^2)

代码语言:javascript
复制
public static int[] insertSort(int[] arr){
    int i,j,temp;
    for(i = 1; i < arr.length; i++){
        temp = arr[i];
        for(j = i; j > 0 && arr[j-1] > temp; j--){
            arr[j] = arr[j-1];
        }
        arr[j] = temp;
    }
    return arr;
}

二分插入排序:O(n^2)

代码语言:javascript
复制
public static int[] binaryInsertSort(int[] arr){
    int i,j,low,high,mid,temp;
    for(i = 1; i < arr.length; i++){
        temp = arr[i];
        low = 0;
        high = i - 1;
        while(low <= high){		//最后一个也要比较,比完就知道具体位置了
            mid = (low + high) / 2;
            if(temp < arr[mid]){
                high = mid - 1;
            }else{
                low = mid + 1;
            }
        }
        for(j = i; j > high+1; j--){
            arr[j] = arr[j-1];
        }
        arr[high+1] = temp;
    }
    return arr;
}

希尔排序:O(nlog n)

代码语言:javascript
复制
public static int[] shellSort(int[] arr){
    int i,j,d,temp;
    for(d = arr.length/2; d > 0; d /= 2){
    	for(i = d; i < arr.length; i++){
    		temp = arr[i];
    		for(j = i; j > 0 && arr[j-d] > temp; j -=d){
    			arr[j] = arr[j-d];
    		}
    		arr[j] = temp;
    	}
    }
    return arr;
}

2. 交换排序

冒泡排序:O(n^2)

代码语言:javascript
复制
public static int[] bubbleSort(int[] arr){
    int i,j,temp;
   
    for(i = 0; i < arr.length - 1; i++){
    	for(j = 0; j < arr.length - 1 - i; j++){
    		if(arr[j] > arr[j+1]){
    			temp = arr[i+1];
    			arr[i+1] = arr[i];
    			arr[i] = temp;
    		}
    	}
    }
    return arr;
}

快速排序:O(nlog2 n)

代码语言:javascript
复制
public static int partition(int[] arr,int i,int j){
	
	int temp = arr[i];	//基准
	while(i < j){
		while(i < j && temp <= arr[j]){
			j--;
		}
		arr[i] = arr[j];
		while(i < j && arr[i] < temp ){
			i++;
		}
		arr[j] = arr[i];
	}
	arr[i] = temp;
	return i;
}

public static void quickSort(int[] arr,int i,int j){
	int mid;
	if(i < j){
		mid = partition(arr,i,j);
		quickSort(arr, i, mid-1);
		quickSort(arr, mid+1, j);
	}
}

3. 选择排序

简单选择排序:O(n^2)

代码语言:javascript
复制
public static void SimpleSelectSort(int[] arr){
	int i,j,index,temp;
	for(i = 0; i < arr.length-1; i++){
		index = i;
		for(j = i+1; j < arr.length; j++){
			if(arr[index] > arr[j]){
				index = j;
			}
		}
		temp = arr[index];
		arr[index] = arr[i];
		arr[i] = temp;
	}
}

堆排序:O(nlog2 n)

代码语言:javascript
复制
public static void sift(int[] arr,int low,int high){
	int i = low;	//父结点
	int j = i * 2;	//左子结点
	int temp = arr[i];	//临时保存根结点
	
	while(j <= high){
		if(j < high && arr[j] < arr[j+1]){
			j++;	//指向右子结点
		}
		if(temp < arr[j]){
			arr[i] = arr[j];  //较大子节点放入根节点
			i = j;
			j = i * 2;
		}else{
			break;	//默认左右子树是大根堆,若不用交换,当前结点的下面都是大根堆
		}
	}
	arr[i] = temp;		//最后筛选完成才将根节点与最后交换的结点互换
}

public static void heapSort(int[] arr){
	
	//建立初始堆
	int i,temp;
	int length = arr.length-1;
	for(i = length/2; i >= 0; i--){
		sift(arr,i,length);
	}
	
	// 走 n-1躺
	for(i = length; i >= 1; i--){
		temp = arr[i];
		arr[i] = arr[0];
		arr[0] = temp;		//交换arr[1],arr[i]
		sift(arr,0,i-1);
	}
}

4. 归并排序

二路查找:O(nlog2 n)

代码语言:javascript
复制
public static void merge(int[] arr,int left,int mid,int right){
	int[] leftArr = new int[mid - left];
	int[] rightArr = new int[right - mid + 1];
	
	for(int i = left; i < mid; i++){
		leftArr[i - left] = arr[i];
	}
	for(int i = mid; i <= right; i++){
		rightArr[i - mid] = arr[i];
	}
	
	int i = 0, j = 0;
	int index = left;
	
	while(i < leftArr.length && j < rightArr.length){
		
		if(leftArr[i] < rightArr[j]){
			arr[index] = leftArr[i];
			i++;
			index++;
		}else{
			arr[index] = rightArr[j];
			j++;
			index++;
		}
	}
	
	while(i < leftArr.length){
		arr[index] = leftArr[i];
		i++;
		index++;
	}
	while(j < rightArr.length){
		arr[index] = rightArr[j];
		j++;
		index++;
	}
}

public static void mergeSort(int[] arr, int left, int right){
	if(left < right){
		int mid = (left + right) / 2;
		mergeSort(arr, left, mid);
		mergeSort(arr, mid+1, right);
		merge(arr, left, mid+1, right);
	}
}

5. 基数排序(桶排序,非计数排序)

代码语言:javascript
复制
// 返回最大值
private static int findMax(int[] arr){
	int temp = arr[0];
	for(int value : arr){
		if(temp < value){
			temp = value;
		}
	}
	return temp;
}

public static void radixSort(int[] arr){
	
	int max = findMax(arr);
	
	// 比较次数由最大值的位数决定
	for(int i = 1; max / i > 0; i *= 10){
		int[][] buckets = new int[arr.length][10];
		// 将每一个值根据当前比较的位数放入桶中
		for(int j = 0; j < arr.length; j++){
			int num = (arr[j] / i) % 10;
			buckets[j][num] = arr[j];
		}
		int k = 0;
		for(int m = 0; m < 10; m++){
			for(int n = 0; n < arr.length; n++){
				if(buckets[n][m] != 0){
					arr[k++] = buckets[n][m];
				}
			}
		}
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 插入排序
  • 2. 交换排序
  • 3. 选择排序
  • 4. 归并排序
  • 5. 基数排序(桶排序,非计数排序)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档