• 一定要掌握的常见排序


    一定要熟悉的排序

    1.直接插入排序

    void InsertSort(int[] a, int n) {
            for (int i = 1; i < n; i++) {
                if (a[i] < a[i - 1]) { // 若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入
                    int x = a[i]; // 复制为哨兵,即存储待排序元素
                    int j = 0;
                    for (j = i - 1; j >= 0; j--) {// 查找在有序表的插入位置
                        if (x >= a[j]) {
                            break;
                        }
                        a[j + 1] = a[j];// 元素后移
                    }
                    a[j + 1] = x; // 插入到正确位置
                }
            }
        }

    2.shell排序

    /*
         * 设初始序列有n个元素,选定一个小于n大于或等于1的整数gap作为间隔,将全部元素分成子序列,
         * 所有距离为gap的元素放在同一个子序列中,在每个子序列中分别采用直接插入算法进行排序;然后缩小间隔gap,如令gap=gap/2,
         * 重复上面的子序列划分和子序列排序动作;直到最后gap=1,将所有的元素放到一个序列中为止。
         */
       void shellSort(int[] number) {
            int gap = number.length / 2; // 一个组合中两个元素的差也是组合类型数
    
            while (gap > 0) {
                for (int k = 0; k < gap; k++) {
                    for (int i = k + gap; i < number.length; i += gap) { // 遍历子序列中的元素,插入排序
                        for (int j = i - gap; j >= k; j -= gap) {
                            if (number[j] > number[j + gap]) {
                                swap(number, j, j + gap);
                            } else
                                break;
                        }
                    }
                }
                gap /= 2;
            }
        }
    
        void swap(int[] number, int i, int j) {
            int t;
            t = number[i];
            number[i] = number[j];
            number[j] = t;
        }
    3.选择排序
    void selectSort(int a[], int n) {
            for (int i = 0; i < n; i++) {
                int k = i;
                for (int j = i + 1; j < n; j++) { // 选择最小的元素
                    if (a[k] > a[j])
                        k = j;
                }
                if (k != i) {
                    int tmp = a[i];
                    a[i] = a[k];
                    a[k] = tmp; // 最小元素与第i位置元素互换
                }
            }
        }
    
    

    4.冒泡排序

     void bubbleSort(int r[], int n) {
            int i = n - 1; // 初始时,最后位置保持不变
            while (i > 0) {
                int pos = 0; // 每趟开始时,无记录交换
                for (int j = 0; j < i; j++)
                    if (r[j] > r[j + 1]) {
                        pos = j; // 记录交换的位置
                        int tmp = r[j];
                        r[j] = r[j + 1];
                        r[j + 1] = tmp;
                    }
                i = pos; // 为下一趟排序作准备
            }
        }

    5.快速排序

        void quickSort(int R[], int low, int high) {
            if (low < high) {
                int pos = Partition(R, low, high);
                quickSort(R, low, pos - 1);
                quickSort(R, pos + 1, high);
            }
        }
    
      int Partition(int[] r, int i, int j) {
            int pivot = r[i];
            while (i < j) {
                while (i<j && r[j] >= pivot) {
                    j--;
                }
                if (i < j) {
                    r[i] = r[j];
                    i++;
                }
                while (i<j && r[i] <= pivot) {
                    i++;
                }
                if (i < j) {
                    r[j] = r[i];
                    j--;
                }    
            }
            
            r[i] =pivot;//确定r[pos]的位置
            return i;
        }
     
  • 相关阅读:
    pg之使用pg_upgrade进行大版本升级 规格严格
    Normalization(标准化)的一些记录
    深度学习面试的一些题目
    几篇关于Transformer和Bert讲得不错的文章
    两篇关于情感方面的文章,还不错
    Focal Loss的学习和理解
    一篇关于PLM和NLG领域的综述
    NLP一篇文章的读书笔记
    情感分析读书笔记
    学习率和训练过程的关系
  • 原文地址:https://www.cnblogs.com/interfaceone/p/6945553.html
Copyright © 2020-2023  润新知