算法学习~分治法~快速排序

天天都在排序。。简直就是要给这个混乱的世界一个正确的秩序。。不过嘛。排序也有快慢之分,

冒泡排序法,,思路很简单就是一个个上去打擂台,,这样的时间复杂度很糟糕,,O(N^2)中O是一个常数,O(N^2)是指最大上限(估值)n(n-1)/2 = (n^2 - n)/2最高位估值仍为n^2两种情况是一样的。

选择排序法,,每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(最后),直到全部待排序的数据元素排完。选择排序是不稳定的排序方时间复杂度为O(n),最坏情况下仍为O(n^2)。

排序比较好的还有这种logn级别的排序法,

先上代码,,个位可以先瞅瞅,。一般第一次不会很明白。。下面有解释。。

 1 //快速排序
 2 #include<stdio.h>
 3 int main()
 4 {   void quick_sort(int s[], int l, int r);
 5     int a[10001],i,x;
 6    while(~scanf("%d",&x))
 7    {  for(i=0;i<x;i++)
 8         scanf("%d",&a[i]);
 9      quick_sort(a,0,x-1);//第一个参数是数组地址,然后是需要排序的区间,i就是长度
10    for(i=0;i<x;i++)
11     {
12        printf("%d ",a[i]);//再顺序输出
13     }
14     printf("\n");
15    }
16 }
17 void quick_sort(int s[], int l, int r)//返回调整后基准数的位置
18 {
19     if (l < r)//只要是满足起点小于终点
20     {
21         //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
22         int i = l, j = r, x = s[l];//赋予初始值,i就是起点j就是终点 //s[l]就是当前的值
23         while (i<j)
24         {
25             while(i<j&&s[j]>=x) // 从右向左找第一个小于x、起点的数
26                 j--;//找到第一个小于的就会跳出循环j的值就是当前小于的那个
27             if(i<j)
28                 s[i++]=s[j];//将s[j]填到s[i]中,s[j]就形成了一个新的坑,i++
29             while(i<j&&s[i]<x) // 从左向右找第一个大于等于x的数
30                 i++;
31             if(i<j)
32                 s[j--]=s[i];//
33         }
34         s[i] = x;//退出时,i等于j。将x填到这个坑中。
35         quick_sort(s,l,i-1); //递归调用前半段和后半段。
36         quick_sort(s,i+1,r);
37      }
38 }
时间: 2024-10-16 14:02:55

算法学习~分治法~快速排序的相关文章

算法学习---分治法和快速排序

"分治者,分而治之也"分治法的主要思想就是1.若问题足够小,解决并返回 2.若问题规模不够小,减小问题规模.分治法,很容易理解,就是大而化小,小而化了的思想,把问题划分成你能解决的问题. // 分治法 divide_and_conquer(P) { if(|P|<=n0){ process(P); } else{ divide P into smaller subinstances P1,P2,...,Pk for(int I=1;I<k;i++) yi=divide_an

【算法】分治法细则

分治法的基本步骤:1.分解问题(Divide):把原问题分解为若干个与原问题性质相类似的子问题;2.求解字问题(Conquer):不断分解子问题并求解;3.合并子问题的解(Combine). 分治法的运用条件:1.原问题可以分解为若干与原问题的解:2.子问题可以分解并可以求解:3.子问题的解可以合并为原问题的解:4.分解后的子问题应互相独立,即不包含重叠子问题(如菲不那切竖列). 求解递归函数的方法: 1.代换法1)猜测解的行为:2)数学归纳法证明. 2.递归树法在递归树中,每一个结点都代表递归

[算法]:分治法-求大整数相乘

#问题大整数相乘 #思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持**"无限精度"的整数,**一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 51872581574157002360341697913

常用算法之分治法与动态规划法

之所以把这两种算法放到一起,是因为它们都是用来求最优解的问题,与贪心算法是不同的.但是这两种算法又有一些区别,下面来做解释: 分治,即分而治之,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.     上图用一个例子来解释如下: 当n>1时,想求得T(n),必须知道T(n-1),以此类推,所以要想求得T(n)就必须将T(n)分解,从最小的子问题开始计算,最终求得T(n),这个过程就是一个递归.分治与

数据结构与算法6 - 分治法(上)

分治法: 1. 将问题拆分为几个子问题,并且这些子问题和原问题相似只是量级上小一些. 2. 递归地解决每一个子问题,然后结合这些子问题的解决方案构造出原问题的解决方案. 我们已经遇到过的问题: 1. 二分搜索 2. 归并排序 3. 快速排序 分治法例子: 练习1:快速指数: 能够快速计算出a的n次方 def Fast_pow(a, n): if n == 0: return 1.0 elif n < 0: return 1 / Fast_pow(a, -n) elif n % 2: # 奇数 r

算法题|-分治法解决最大子数组问题

分治法就是将一个复杂难解决问题拆成一些容易解决的小问题,再依次解决而最终解决整个问题 new int[] { 2, -3, 4, 67, 6 } 这样一个下标为0到4的数组,要找最大子数组,需要将其拆分成两个子数组,mid=(0+4)/2 即为0~mid的左数组和mid+1~4的右数组 最大子数组可能会出现在以下三个地方 左数组中的某个最大子数组 右数组中的某个最大子数组 以mid为界,向左找到一个最大数组,向右找到一个最大数组,将两个数组合并 第三种情况非常容易得到,通过遍历查找就可以解决,而

【算法】分治法

思想:分,递归解决若干个较小的问:治,从子问题的答案中形成原始问题的解: 算法举例:快速排序,树的遍历: 快速排序代码:见网址https://www.cnblogs.com/dreamer123/p/9519498.html 原文地址:https://www.cnblogs.com/dreamer123/p/12083061.html

js算法:分治法-棋盘覆盖

在一个 2^k * 2^k 个方格组成的棋盘中,若恰有一个方格与其他方格不同.则称该方格为一特殊方格,称该棋盘为一特殊棋盘.显然特殊方格在棋盘上出现的位置有 4^k 种情形.因而对不论什么 k>=0 .有 4^k 种不同的特殊棋盘. 下图所看到的的特殊棋盘为 k=2 时 16 个特殊棋盘中的一个. 在棋盘覆盖问题中,要用下图中 4 中不同形态的 L 型骨牌覆盖一个给定的特殊棋牌上除特殊方格以外的全部方格,且不论什么 2 个 L 型骨牌不得重叠覆盖. 易知,在不论什么一个 2^k * 2^k 的棋

OJ刷题---分治法快速排序

输入代码: //算法分析 //1)设置两个变量I.J,排序开始的时候:I=0,J=N-1: //2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0]: //3)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于key的值A[j],A[j]与A[i]交换: //4)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于key的A[i],A[i]与A[j]交换: //5)重复第3.4.5步,直到 I=J: (3,4步是在程序中没找到时候j=