排序算法
- 冒泡排序
/**
* 冒泡排序
* @param num
*/
public void bubbleSort(int[] num){
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length-i-1; j++) {
if(num[j]>num[j+1]){
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
}
}
- 选择排序
/**
* 选择排序
* @param nums
*/
public void selectSort(int[] nums){
for (int i = 0; i < nums.length; i++) {
int minIndex = i;
for (int j = i; j < nums.length; j++) {
if(nums[j]<nums[minIndex]){
minIndex = j; //更新最小值的下标
}
}
//将当前元素与目前最小值交换
int temp = nums[minIndex];
nums[minIndex] = nums[i];
nums[i] = temp;
}
}
- 插入排序
/**
* 直接插入排序
* @param nums
*/
public void insertSort(int[] nums){
int n = nums.length;
for(int i=1;i<n;i++){
//待排序元素小于有序序列的最后一个元素时,向前插入
if(nums[i]<nums[i-1]){
int temp = nums[i]; //待排序元素
for(int j=i;j>=0;j--){
if(j>0&&nums[j-1]>temp){
nums[j] = nums[j-1]; //元素后移
}else{
nums[j] = temp; //放在合适的位置
break;
}
}
}
}
}
- 希尔排序
/**
* 希尔排序
* @param nums
*/
public void shellSort(int[] nums){
int len = nums.length;
int d = len/2; //增量
while(d>0) {
//一趟排序
for (int i = d;i<len;i++) {
for (int j = i;j>=d;j-=d) {
if (nums[j] < nums[j-d]) {
int temp = nums[j - d];
nums[j - d] = nums[j];
nums[j] = temp;
}
}
}
d /= 2;//每次增量减半
}
}
- 堆排序 ```java import java.io.; import java.util.; import java.text.; import java.math.; import java.util.regex.*;
public class Main{ public void heapSort(int[] nums){ int len = nums.length; //构建大顶堆 for(int i=len/2-1;i>=0;i—) { adjustHeap(nums,i,len); } System.out.println(Arrays.toString(nums)); for (int j=len-1;j>0;j—) { //交换堆顶和最后一个元素 int temp = nums[0]; nums[0] = nums[j]; nums[j] = temp; //调整堆,注意不能取到最后一个元素 adjustHeap(nums,0,j); } }
//调整堆
public void adjustHeap(int[] nums,int i,int len){
int temp = nums[i];
//沿关键字较大的孩子节点向下筛选
for(int j=i*2+1;j<len;j=j*2+1){
//选出左右节点中较大的节点
if (j+1<len && nums[j] < nums[j+1]) {
j++;
}
//再将较大值与根节点相比较
if (nums[j] > temp) {
nums[i] = nums[j];
//更新i
i = j;
}else{
break;
}
}
nums[i] = temp;//将temp放到最终位置
}
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7};
Main main = new Main();
main.heapSort(nums);
System.out.println(Arrays.toString(nums));
}
}
-
归并排序
```java
public void mergeSort(int[] nums){
int[] p = Arrays.copyOf(nums,nums.length);
mergeSort(nums,0,nums.length-1,p);
}
private void mergeSort(int[] nums, int left, int right,int[] p) {
if(left==right) return; //1个元素时总是有序的
int mid = left + (right - left) / 2;
mergeSort(nums, left, mid,p); //使左半部分有序 前闭后开
mergeSort(nums, mid + 1, right,p); //使右半部分有序
if(nums[mid]<=nums[mid+1]) return; //若整个数组已经有序,则不需要合并
merge(nums, left, mid, right,p);//跨越两个区间有序
}
private void merge(int[] nums, int left, int mid, int right,int[] p) {
//拷贝数组
for(int i=left;i<=right;i++){
p[i] = nums[i];
}
//左右数组的起点
int i = left;
int j = mid+1;
//插入排序
for(int k=left;k<=right;k++){
//只有左边数组
if(j==right+1){
nums[k] = p[i++];
}else if(i==mid+1){
nums[k] = p[j++];
}else{
if(p[i]>p[j]){
nums[k] = p[j++];
}else{
nums[k] = p[i++];
}
}
}
}
快速排序
/**
* 快速排序
* @param nums
*/
public void quickSort(int[] nums){
quickSort(nums,0,nums.length-1);
}
private void quickSort(int[] nums, int left, int right) {
if(left>=right) return;
int index = selectIndex(nums,left,right);
quickSort(nums,left,index-1);
quickSort(nums, index+1, right);
}
private int selectIndex(int[] nums, int left, int right) {
int temp = nums[left];
while(left<right){
while(left<right&&nums[right]>=temp){
right--;
}
nums[left] = nums[right];
while(left<right&&nums[left]<=temp){
left++;
}
nums[right] = nums[left];
}
nums[left] = temp;//一定要还原回去,不能破坏原数组的数据
return left;
}