常用的排序算法

本文详细介绍了四种排序算法:冒泡排序、选择排序、插入排序和递归排序。从算法原理、实现代码到时间复杂度分析,深入浅出地解释了每种算法的特点和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序

 时间是o(n2)

首先从序号0开始直到数组长度减1,查找最大值,并两两交换,将最大值交换到最后,然后重复过程,需要排序的长度要减去已经找到的最大值。

import java.util.*;

public class BubbleSort {
    public int[] bubbleSort(int[] A, int n) {
        // write code here
        int t = 0;
        int len = A.length;
        for (int j = 0; j < A.length; j++){
        	for (int i = 0; i < len; i++){
                    if (A[i] > A[i+1]){
                        t = A[i+1];
                        A[i+1] = A[i];
                        A[i] = t;
                    }
            } 
            len--;
        }
        return A;
    }
}

选择排序

数组长度为n

第一步从数组n个数中,选出最大的数,并且于A[0]交换,后面的步骤重复第一步,只是从A[i]开始。

import java.util.*;

public class SelectionSort {
    public int[] selectionSort(int[] A, int n) {
        // write code here	
        for(int i = 0; i < n; i++){
            int firstArray = A[i];
            int number = i;
            for(int j = i; j < n; j++){
                if(firstArray > A[j]){
                    firstArray = A[j];
                    number = j;
                }
            }
            int temp = A[i];
            A[i] = A[number];
            A[number] = temp;
        }
        return A;
    }
}

插入排序

从序号1开始与前面比较,当发现比前面的值小,就插入,直到没有位置可以向前插入,序号就加1,在进行与前面的对比。

import java.util.*;

public class InsertionSort {
    public int[] insertionSort(int[] A, int n) {
        // write code here
        for (int i = 0; i < n-1; i++){
            for(int j = i+1; j >0;j--){
                if(A[j] < A[j-1]){
                    int temp = A[j];
                    A[j] = A[j-1];
                    A[j-1] = temp;
                }
            }
        }
        return A;
    }    
}

递归排序

将数组分为左右两部分,然后每一部分继续递归,分成更小的部分,直到left=right,然后再将最小部分合并,合并时需要查看A[left]和A[right]的大小,大于就先将大的一部分放入临时数组中,再将小的数组放入临时数组,left和right起到了像指针一样的作用,将这一个小数组代码块放入原来数组的相应位置,再往上传递。

import java.util.*;

public class MergeSort {
    public int[] mergeSort(int[] A, int n) {
        // write code here
        sort(A, 0, n-1);
        return A;
    }
    public void sort(int[] data, int left, int right){
        if(left == right) return;
        int middle = (left + right)/2;
        sort(data, left, middle);
        sort(data, middle+1, right);
        merge(data, left, middle, right);
    }
    public static void merge(int[] data, int left, int middle, int right){
        int[] newData = new int[right - left +1];
        int l = left;
        int r = middle + 1;
        int index = 0;
        while(l <= middle&& r<=right){
            if(data[l] <= data[r]){
                newData[index++] = data[l++];
            }else{
                newData[index++] = data[r++];
            }
        }
        while(l <= middle){
            newData[index++] = data[l++];
        }
        while(r <= right){
            newData[index++] = data[r++];
        }
        for(int i = 0; i < newData.length; i++){
            data[left + i] = newData[i];
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值