c语言实现快速排序

news/2024/7/24 8:06:02 标签: c/c++

C语言下的快速排序

快速排序是一种优雅的算法,在最坏情况下,Quicksort可能需要 n^2 的时间来对数组元素进行排序。而在最优的情况下,它将选择中值作为划分元素,因此只需 nlgn 次的比较就可以完成数组的配需。 快速排序的基本思想是基于分治策略的。要研究这种算法,那么必须说到冒泡法排序,因为快速排序是对冒泡排序的一宗改进。它的基本思想是,通过一趟排序将戴记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行配需,以达整个序列有序。 作为一种分治策略包括三个步骤:分解-递归求解-合并;它包括三个核心部分:比较-置换-递归 。

 

假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:

  1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;

  2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

  3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

  4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

  5)、重复第3、4步,直到I=J;

  例如:待排序的数组A的值分别是:(初始关键数据X:=49)

                  A[1]    A[2]    A[3]    A[4]    A[5]     A[6]    A[7]: 

                    49       38      65      97      76      13       27

进行第一次交换后:  27       38      65      97      76      13       49

                  ( 按照算法的第三步从后面开始找

进行第二次交换后:  27       38      49      97      76      13       65

                 ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )

进行第三次交换后:  27       38      13      97      76      49       65

( 按照算法的第五步将又一次执行算法的第三步从后开始找

进行第四次交换后:  27       38      13      49      76      97       65

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )

     此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27       38      13      49      76      97       65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

     快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

 

 初始状态                       {49    38    65    97    76    13    27}   

进行一次快速排序之后划分为     {27    38    13}    49  {76    97    65}

分别对前后两部分进行快速排序 {13}   27   {38}

 结束        结束   49   {65}   76   {97}

 

 2013年12月2日星期一

参考代码:

#include <stdio.h>

#include <time.h>
#include <string.h>
int partion(int num[], int, int);
void fast_sort(int num[], int, int);
void sort(int*, int*);
int main()
{
    int num[10];
    int i = 0;
    int flag = 0;
    int j = 0;
    srand((unsigned int)time(NULL));//随机种子
    for (i = 0;i < 10; i++)
    {
        num[i] = rand()%30+1;//随机生成10个随机数(0-30)
        flag = i;
for (j = 0; j < flag; j++)//该循环是控制生成10个不重复的数
{
   if (num[i] == num[j])
   {
       i--;
break;
   }
}
    }
    puts(" befor sort is :\n");
    for (i = 0; i < 10; i++)
    {
         printf("%d\t",num[i] );
    }
    puts("\n");
    puts("after sort is:\n");
    fast_sort(&num[0], 0, 9);
    for (i = 0; i < 10; i++)
    {
         printf("%d\t",num[i] );
    }
    puts("\n");
    return 0;
}
//分割
int partion(int num[], int low, int higt)
{

    int flag = num[low];
    int pivotkey = num[low];
    while(low < higt)
    {
        while ((low<higt)&&(num[higt]>=pivotkey))
--higt;
        sort(&num[low], &num[higt]);
while ((low<higt)&&(num[low]<=pivotkey))
++low;
sort(&num[low], &num[higt]);
    }
    num[low] = flag;
    return low;
}
//进行递归的快速排序
void fast_sort(int num[], int low, int higt)
{
    int pivot;
    if (low < higt)
    {
        pivot = partion(num, low, higt);
fast_sort(num, low, pivot-1);
fast_sort(num, pivot+1, higt);
    }
}
//交换函数
void sort(int *low, int *higt)
{
    int tmp;
    tmp = *low;
    *low = *higt;
    *higt = tmp;
}

转载于:https://www.cnblogs.com/wxishang/p/3390249.html


http://www.niftyadmin.cn/n/853308.html

相关文章

《剑指offer》-- 字符串

题目描述 请实现一个函数&#xff0c;将一个字符串中的空格替换成“%20”。 例如&#xff0c;当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 分析 将长度为1的空格替换为长度为3的“%20”&#xff0c;字符串的长度变长。 如果允许我们开辟一个新的数…

TensorFlow里面mnist导入手写数据代码分析

TensorFlow里面mnist导入手写数据代码分析 本文主要介绍了Tensorflow(TF)手写识别&#xff0c;导入数据源码分析 在 tensorflow/tensorflow/examples/tutorials/mnist 目录下&#xff0c;文件树如下&#xff1a; [xzylocalhost mnist]$ tree . ├── BUILD ├── fully_…

VC++基础 判断键盘消息

头文件变量声明&#xff1a; 1 BOOL bShiftdown,bShiftup,bShiftB; 消息事件声明&#xff1a; 1 afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); 2 afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); 3 afx_msg void OnChar(UINT nCha…

线控的原理

先前的改装文章在此http://bbs.xiaomi.com/thread-1372419-1-1.html说明线控的原理&#xff1a;接听键就是短路mic&#xff0c;很简单&#xff0c;大多数耳机都是这样做的&#xff0c;那么线控呢&#xff1f;拆开htc原装耳机后发现&#xff0c;选曲键利用了不同的电阻短接mic线…

《剑指Offer》反转链表 Python实现

一、题目描述 输入一个链表&#xff0c;反转链表后&#xff0c;输出新链表的表头。 二、解题思路 把listNode中的next改为null可以&#xff0c;但是想把listnodenull就麻烦了。因为你自己定义的listnodehead的话&#xff0c;listnodenull时head并不是空。这个也是清理对象时…

numpy里面的argmax函数

numpy里面的argmax函数 函数原型&#xff1a;def argmax(a, axisNone, outNone) a----输入array axis----为0代表列方向&#xff0c;为1代表行方向 out----结果写到这个array里面 例子&#xff1a; >>>import numpy as np a np.array([[2,4,6,1],[1,5,2,9]])>&…

图解Oracle Checkpoint Queue

图解Oracle Checkpoint Queue 转载于:https://blog.51cto.com/maclean/1278286

C语言笔记 第四十课 程序的内存布局

第四十课 程序的内存布局 程序文件的一般布局 不同代码在可执行程序中的对应关系 程序与进程—操作系统原理 程序和进程不同 程序是静态的概念&#xff0c;表现形式为一个可执行文件 进程是动态的概念&#xff0c;程序由操作系统加载运行后得到进程 每个程序可以对应多个进…