• 10.16课上


    煎饼排序

    第一步找剩余数组里的最大值,然后从头到这里翻转一次,这样最大值就到了开头,再把开头从当前结尾翻转一次,就把当前的最大值翻转到了最后

    1. class Solution {
    2. public:
    3. vector<int> pancakeSort(vector<int>& arr)
    4. {
    5. /*一种类选择排序的思路
    6. 我们有一种方法可以把当前数组最大元素放到数组结尾
    7. 假设当前数组长度为n 设最大元素的下标为index
    8. 如果它的下标就在n - 1 那就不用翻转了 它已经处于正确位置了
    9. 首先翻转index + 1 然后这个元素就会到首位
    10. 然后翻转n 就是整个数组翻转一下 这个元素就会到末尾
    11. 因此每次摆放玩最大元素就让数组长度减1,接着操作
    12. 直到数组长度为1为止
    13. 这样总共最多会翻转2 * (arr.length - 1)次 是符合题意的*/
    14. vector<int> ret;
    15. for (int n = arr.size(); n > 1; --n)
    16. {
    17. int index = max_element(arr.begin(), arr.begin() + n) - arr.begin();
    18. if (index == n - 1) continue;
    19. reverse(arr.begin(), arr.begin() + index + 1);
    20. reverse(arr.begin(), arr.begin() + n);
    21. ret.push_back(index + 1);
    22. ret.push_back(n);
    23. }
    24. return ret;
    25. }
    26. };

    D.2*(N-2)+1

    快速排序思路

    每次都选一个基元,然后有一个左指针和一个右指针,完成两个目的,一个是固定基元的最终实际位置,另一个是说,让其最终位置之前的元素都比它小,其之后的元素都比它大

    如果左指针向后遍历,直到遇到第一个比基元大的;右指针向前遍历,直到遇到第一个比基元小的;都停止时,进行交换,然后重复这一过程,直到左指针和右指针指向同一个元素,这时就是终点,让其和基元交换,就是基元的最终位置

    1. void quick_sort(int num[], int low, int high )
    2. {
    3. int i,j,temp;
    4. int tmp;
    5. i = low;
    6. j = high;
    7. tmp = num[low]; //任命为中间分界线,左边比他小,右边比他大,通常第一个元素是基准数
    8. if(i > j) //如果下标i大于下标j,函数结束运行
    9. {
    10. return;
    11. }
    12. while(i != j)
    13. {
    14. while(num[j] >= tmp && j > i)
    15. {
    16. j--;
    17. }
    18. while(num[i] <= tmp && j > i)
    19. {
    20. i++;
    21. }
    22. if(j > i)
    23. {
    24. temp = num[j];
    25. num[j] = num[i];
    26. num[i] = temp;
    27. }
    28. }
    29. num[low] = num[i];
    30. num[i] = tmp;
    31. quick_sort(num,low,i-1);
    32. quick_sort(num,i+1,high);
    33. }

    冒泡排序的思路是

    从头开始遍历,如果当前元素比后一个元素大,就交换其位置,如果说遇到了最大值,那么每次交换后,都必定比后一个元素大,所以就一定会“冒泡”到此时数组的最后一个位置,由此就是每次都会使当前数组里的最大元素冒泡到对应位置

    ‘冒泡排序的交换次数就是逆序数 

    对于相邻的两个元素AB交换位置,不影响其前后所有元素的情况,也就是说只会影响这两个元素之间的关系,A和B后面的元素能组成逆序对时,AB交换后,A依然能和B后面的元素组成逆序对,如果AB构成逆序对,那么交换后AB的逆序对就消失了,所以相邻元素只会减少一个(交换的条件是前面元素比后面大,即交换时前面元素必定比后面元素大,即交换时就是逆序对),最后排序完后数组有序,逆序对都没了,那就是已经把所有逆序对都计上了

    最多K次相邻交换

    假设前i个是有序的,从第i个开始,往后k个找到最小的,然后和第i+1位交换(冒泡交换),共需要J-1次交换,那么此时还剩下k-j+1次交换次数,前i+1有序

    递归解决,记录开始下标与剩余交换次数,直到下标到顶或者交换次数为0

  • 相关阅读:
    jQuery 中的 AJAX(1 get 请求,2 post 请求,3 通用方法ajax)
    springboot初试elasticsearch
    MII、RMII、 SMII、GMII、RGMII、SMI接口介绍
    No module named ‘importlib.metadata‘
    JVM的内存区域划分
    js中如何使用for..of来遍历对象?
    R 语言马尔可夫链蒙特卡洛:实用介绍
    Linux多线程编程实例解析
    Sklearn逻辑回归
    HTML之MIME type
  • 原文地址:https://blog.csdn.net/m0_73553411/article/details/133853970