C语言实现快速排序法(分治法)



title: 快速排序法(quick sort)

tags: 分治法(divide and conquer method)

grammar_cjkRuby: true

---

算法原理

分治法的基本思想:将原问题分解为若干个更小的与原问题相似的问题,然后递归解决各个子问题,最后再将各个子问题的解组合成原问题的解。

利用分治法可以将解决办法分为 “三步走” 战略:

(1) 在数据集中选定一个元素作为“基准”(pivot)

(2) 将所有数据集小于基准的元素放在基准左边,大于基准的元素放在基准右边,把原数据集分为两个数据集的操作叫做“分区”,分区结束后基准所在的位置也就是基准最后的位置

(3) 分别对基准左右两边的数据集进行前两个步骤,直至数据集只剩下一个数据为止

C语言实现

/***********************/
//章节:第四章
//内容:快速排序
/***********************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>

void fastsort(int v[], int first, int last); 

int main()
{
    int i, v[10] = {1,243,43,5,6,634,434,23,12,7};
    fastsort( v, 0, 9);
    for(i = 0; i < 10; i++)
        printf("%d  ",v[i]);
    return 0;
}

void fastsort(int v[], int first, int last){
    int i, storeindex;
    void swap(int v[], int i, int j);
    if(first >= last)
        return;  //fewer than two ele
    swap(v, last, (first + last)/2); //move partition elem
    storeindex =  first;
    for(i = first; i <= last-1; i++)
        if(v[i] <= v[last])
            {
                swap(v, storeindex, i);
                storeindex += 1;
            }
    swap(v, last, storeindex);
    fastsort(v, first, storeindex - 1);
    fastsort(v, storeindex + 1, last);
}

/*swap:interchange v[i] and v[j]*/
void swap(int v[], int i, int j){
    int temp;
    temp = v[j];
    v[j] = v[i];
    v[i] = temp;
}

实例分析

(1)取5作为pivot,然后将其移动到最后一个位置

(2)从第一个数3到倒数第二个数5分别和pivot比较,如果小于等于pivot的数依次从前向后排

(4)将pivot 5移回两个分区中间

时间: 2024-10-17 00:34:31

C语言实现快速排序法(分治法)的相关文章

005-算法-分治法

一.概念: 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以寄简单的直接求解,原问题的解即子问题的解的合并. 这个技巧是很多高校算法的基础,如排序算法(快速排序.归并排序).傅立叶转换(快速傅立叶变换) 思路: 1.分解:把原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题. 2. 解决:若子问题规模较小且易于解决时,则直接解.否则,递归地解决各子问题. 3.合并:

快速排序(分治法)

问题描述参考:http://blog.csdn.net/code_ac/article/details/74158681 算法实现部分: //random_quick_sort.cpp #include "random_quick_sort.h" #include <stdlib.h> template<class Type> void RandomQuickSort(Type a[], int p, int r) { if (p < r) { int q

分治法、动态规划、回溯法、分支界限法、贪心算法

转:http://blog.csdn.net/lcj_cjfykx/article/details/41691787 分治算法一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时

蓝桥杯——基础练习之分治法_快速排序

分治法,分而治之,基本思路:分,解,和. 初探分治之快速排序. public class _DividedConquer { static int[] iarr; public static void main(String[] args) { // TODO Auto-generated method stub iarr=new int[]{6,4,5,3,1,2}; quick(0, iarr.length-1); for(int i:iarr) { System.out.print(i+"

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最

分治法-合并排序和快速排序

分治法是按照以下方案工作的: 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模 对这些较小的实例求解(一般使用递归方法,但在问题规模足够小的时候,有时会利用另一种算法以提高效率) 如果必要的话,合并较小问题的解,以得到原始问题的解 分治法的流程: 4.1 合并排序 合并排序是成功应用分治技术的一个完美例子(书上说的). 对于一个需要排序的数组,合并排序把它一分为二,并对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组. 代码实现: /** * 合并排序 * @au

算法导论第2章 分治法与归并排序, 二分查找法

分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,最后再合并其结果,就可以得到原问题的解. 它需要三个步骤: 分解:将原问题分解成一系列的子问题. 解决:递归地解决各个子问题.若子问题足够小,则直接求解. 合并:将子问题的结果合并成原问题的解. 通过分治策略和分治步骤,可以简单地默出归并算法. 分解:将n个元素分成各自包含n/2个元素的子序列 解决:用归并排序法递归地对两个子序列进行排序. 合并:合并两个以排序的子序列,得到排序结果: void merge

分治法以及快速排序

分治法 分治法(divide and conquer,D&C):将原问题划分成若干个规模较小而结构与原问题一致的子问题 :递归地解决这些子问题,然后再合并其结果,就得到原问题的解. 容易确定运行时间,是分治算法的优点之一. 分支模式在每一层递归上都有三个步骤: --分解(Divide):将原问题分解为一系列子问题: --解决(Conquer):递归地解各子问题.若子问题足够小,则直接有解: --合并(Combine):将子问题的结果合并成原问题的解. 分治法的关键点: 原问题可以一直分解为形式相

分治法实现1-N的数字按字典序全排列组合 Java语言

package 分治法; import java.util.Arrays; /* * 将数字 1 - n进行全排列 按字典序从小到大输出 * 如 1 - 3 * 123 132 213 231 312 321 */ class GenerateP{ private int n; // 求 1-n所有数字的全排列 private final int maxn = 110;//最多可排列组合的长度 1-100 private boolean [] hashTable; private int []