美文网首页
排序算法

排序算法

作者: const_qiu | 来源:发表于2020-08-23 16:53 被阅读0次

十大经典排序算法
1.选择排序

void SelectSort(vector<int>& nums) {
    int length = nums.size();
    for (int i = 0; i < length-1; i++) {
        int min_index = i;
        for (int j = i + 1; j < length; j++) {
            if (nums[j] < nums[min_index])
                min_index = j;

        }
        swap(nums[i],nums[min_index]);
    }
    return;
 }

2.插入排序

void InsertSort(vector<int>& nums) {
    int length = nums.size();
    for (int i = 1; i < length; i++) {
        int preIndex = i - 1;
        int cur = nums[i];
        while (preIndex>=0&& nums[preIndex]>cur)
        {
            nums[preIndex + 1] = nums[preIndex];
            preIndex--;
        }
        nums[preIndex + 1] = cur;

    }

    return;
 }

3.冒泡排序
循环嵌套,每次查看相邻的元素,如果逆序则交换。(实际中基本不会使用)

void BubbleSort(vector<int>&a) {
    int length = a.size();
    for (int i = 0; i < length; i++) {
        bool flag = false;
        for (int j = length - 1; j > i; j--) {
            if (a[j - 1] > a[j]) {//当前元素与前驱比较,若逆序,则交换
                swap(a[j-1],a[j]);
                flag = true;
            }
            
        }
        if (flag == false) {

            return;
        }

    }
    return;
}
  1. 快速排序
    数组取pivot标杆,小于pivot的放在左边,大于pivot的放右边,然后继续对左边的和右边的子数组进行快排,以达到整个数组有序。
int random_partition(vector<int>& nums, int idx_l, int idx_r) {

    int random_pivot_index = rand() % (idx_r - idx_l + 1) + idx_l;
    int pivot = nums[random_pivot_index];
    swap(nums[random_pivot_index],nums[idx_r]);
       
    int i = idx_l - 1; //统计有多少个小于pivit的元素,类似于双指针思想(快慢指针),i指向比pivot小的最后一个位置,
    for (int j = idx_l; j < idx_r; j++) {
        if (nums[j] < pivot) {
            i++;
            swap(nums[j],nums[i]);
        }
    }
    int idx_pivot = i + 1;
    swap(nums[idx_pivot],nums[idx_r]);
    return idx_pivot;

}

void random_quicksort(vector<int>& nums,int idx_l,int idx_r) {
    if (idx_l < idx_r) {

        int pivot_index = random_partition(nums,idx_l,idx_r);
        random_quicksort(nums,idx_l, pivot_index -1);
        random_quicksort(nums, pivot_index +1,idx_r);
    }
}

int main() {
    
    vector<int> a = { 5,4,3,2,1,4,5,6 };
    int l = 0;
    int r = a.size() - 1;
    random_quicksort(a,l,r);
    for (int it : a) {
        cout<<it<<endl;
    }


    
    return 0;
}

5 归并排序

void merge(vector<int>&nums, int left, int mid, int right) {
    vector<int> tmp(right - left + 1);
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        tmp[k++] = nums[i] < nums[j] ? nums[i++] : nums[j++];
    }
    while (i <= mid)  tmp[k++] = nums[i++];
    while (j <= right) tmp[k++] = nums[j++];
    for (i = left, k = 0; i <= right;) nums[i++] = tmp[k++];
}
void  mergeSort(vector<int>& nums, int left, int right) {

    if (left >= right)  return;
        int mid = left + ((right - left)>>1);
        mergeSort(nums, left, mid);
        mergeSort(nums, mid + 1, right);
        merge(nums, left, mid, right);
    
    
}

int main() {
    
    vector<int> a = { 5,4,3,2,1,4,5,6 };
    int l = 0;
    int r = a.size() - 1;
    mergeSort(a,l,r);
    for (int it : a) {
        cout<<it<<endl;
    }


    
    return 0;
}

6 堆排序

void heapify(vector<int> &array, int length, int i) {  //向下调整堆
    int left = 2 * i + 1, right = 2 * i + 2;
    int largest = i;

    if (left < length && array[left] > array[largest]) {
        largest = left;
    }
    if (right < length && array[right] > array[largest]) {
        largest = right;
    }

    if (largest != i) {
        int temp = array[i]; array[i] = array[largest]; array[largest] = temp;
        heapify(array, length, largest);
    }


    return;
}

void heapSort(vector<int> &array) {
    if (array.size() == 0) return;

    int length = array.size();//初始化堆
    for (int i = length / 2 - 1; i >= 0; i--)
        heapify(array, length, i);

    for (int i = length - 1; i >= 0; i--) {
        int temp = array[0]; array[0] = array[i]; array[i] = temp;
        heapify(array, i, 0);
    }

    return;

}
int main() {

    vector<int> nums = {2,3,6,3,87,4};
    heapSort(nums);
    for (int a : nums) {
        cout << a << endl;
    }
    
    
    return 0;
}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:排序算法

      本文链接:https://www.haomeiwen.com/subject/uugijktx.html