快速排序采用的是两头对比交换

http://t.csdn.cn/TXcAK

上面这个连接大家可以点进去看看博客李小白大大的图文解释,我觉得这个是对我启发比较大的,对刚接触快速排序的人来说非常友好,很快就可以了解到其中的原理。

然后我的代码稍微和里博客李小白的稍稍有点不一样;

我在敲代码过程中发现快速排序对条件限制非常严格,我认为如果你对在从左到右扫描的时候,和从右到左扫描的时候那个限制条件理解了,说明你对这个快速排序的的代码才算真正会敲了,而不是只会原理这么简单。

①首先第一个比较乱的点是我这个代码再从左到右扫描的时候,while条件限制是没有取等号的,且在我这个代码里面是不能取等号,我里面有注释,是因为不能让左边往右走的时候超过基准这个位置,同理右边也是,不能超过基准mid,所以在左右两边退出各自的小while循环的时候都不会超过基准这个位置,而出去之后,遇到if了交换各自的数值,继续对左右都进行各自继续相向走一步。

②往复之后,最终他们会相遇到mid这个位置,遇到if之后继续相向各走一步,那么有了这个操作之后就不符合大循环while这个条件,退出大循环了。

③退出大循环后,你会发现咱的数组被基准分成了两半,这两半分别进行刚刚那个步骤就可以实现快速排序。

④两边各自进入函数运行到函数最后又会被分成两份,这两份中又各自进入函数,又会继续分,这就是为什么有人说快速排序是二分法。

⑤最后当没得分了,也就是代码中left>right的时候,就会return回来,结束整个函数运行,排序完成。

#include<stdio.h>

void quick_pai(int *, int star, int end);//快速排序 

void swap(int *left, int *right);//交换两个数字 

int main()
{
/* */
int i, j;
int arr[10] = {6,1,2,7,9,3,4,5,10,8};
quick_pai(arr, 0, 9);
for(i = 0; i < 10; i++)
{
printf("%d\t", arr[i]);
}
return 0;
} void quick_pai(int *arr, int star, int end)
{
int mid;//基准
int left = star;
int right = end;
mid = arr[(left+right)/2];
if(left > right)
{
return;
}
else
{
while(left <= right)
{
while(arr[left] > mid)//不能取等于号,因为这样会使这个数字在遇到mid的时候不会退出,而是再次移动一格才退出 ,不能使他超过mid的这个位置
{
left++;
}
while(arr[right] < mid)//同理不能取等号,用来限制在位移到mid这个的时候不再移动了
{
right--;//4 5 8 9 6 3 5 8 5 8
} if(left <= right)
//与上面对应的是 这个条件不会使 , 因为上面说了,两个最后都会位移到mid这个位置上,所以左边下标要么小于右边,要么等于,所以这个可以取等号
{
swap(&arr[left], &arr[right]);//如果左边下标小于右边下标则交换
left++;
right--;
} }
} if(star < right) quick_pai(arr, star, right);//因为刚刚right--了,往左又移动了一步,所以这个right其实已经小于left了,所以在左边用right
/*对左边排序, 不取等号的原因是在return那里的条件没有取等号,
所以在等于的时候不会返回,所以在传进去的时候就不能取等号,
就不会导致在应该结束的时候不会return回来
*/ if(left < end) quick_pai(arr, left, end);//同理因为 left已经大于right了,所以在右边用left
//对右边排序 } void swap(int *left, int *right)
{
int t;
t = *left;
*left = *right;
*right = t;
}

C语言:快速排序(详解)的更多相关文章

  1. 快速排序详解(C语言/python)

    快速排序详解 介绍: 快速排序于C. A. R. Hoare在1960年提出,是针对冒泡排序的一种改进.它每一次将需要排序的部分划分为俩个独立的部分,其中一个部分的数比的数都小.然后再按照这个方法对这 ...

  2. 深入理解C语言 - 指针详解

    一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...

  3. c++、Java、python对应的编译型语言和解释性语言区别详解

    1.首先明确一点: 高级语言是不能直接在CPU上运行的.CPU只能处理机器语言,就是黑客帝国里面那个10101010101110的数字流. 那么为了让机器语言能够在CPU上运行,那么就必须将其变成机器 ...

  4. C语言指针详解

    前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文. 为什么需要指针? 指针解决了一些编程中基本的问题. 第一,指针的使用 ...

  5. 小程序脚本语言WXS详解

    WXS脚本语言是 Weixin Script脚本的简称,是JS.JSON.WXML.WXSS之后又一大小程序内部文件类型.截至到目前小程序已经提供了5种文件类型. 解构小程序的几种方式,其中一种方式就 ...

  6. C语言正则表达式详解 regcomp() regexec() regfree()详解

    标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库 ...

  7. Canny边缘检测算法原理及C语言实现详解

    Canny算子是John Canny在1986年提出的,那年老大爷才28岁,该文章发表在PAMI顶级期刊上的(1986. A computational approach to edge detect ...

  8. Go语言interface详解

    interface Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服. 什么是interface 简单 ...

  9. C语言关键字详解

    相对于其他语言来说,C语言的关键字算是少的了.在C98中关键子总共只有32个,我们来分析一下每个关键字在C语言中它独特的作用. 1.关于数据类型的关键字 (1) char :声明字符型变量或函数  ( ...

  10. C语言typeof详解 offsetof

    http://blog.chinaunix.net/uid-28458801-id-4200573.html 前言:    typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常 ...

随机推荐

  1. #最大流#WOJ 124 Football Coach

    题目 有\(n\)支球队,互相之间已经进行了一些比赛.现在还有\(m\)场比赛未进行, 每场比赛胜者得2分,平局各得1分,负者不得分. 问是否存在一种方法使得球队\(n\)的得分比其他\(n-1\)支 ...

  2. 【直播回顾】OpenHarmony知识赋能六期第三课—OpenHarmony智能家居项目之控制面板功能实现

    7月14日晚上19点,知识赋能第六期第三节直播 <OpenHarmony智能家居项目之控制面板功能实现> ,在OpenHarmony开发者成长计划社群内成功举行. 本次直播是"O ...

  3. Yolov5代码详解——detect.py

    首先执行扩展包的导入: import argparse import os import platform import sys from pathlib import Path ​ import t ...

  4. HarmonyOS线性容器特性及使用场景

      线性容器实现能按顺序访问的数据结构,其底层主要通过数组实现,包括ArrayList.Vector.List.LinkedList.Deque.Queue.Stack七种. 线性容器,充分考虑了数据 ...

  5. HarmonyOS助力构建“食用菌智慧农场”

     原文:https://mp.weixin.qq.com/s/qK4aRY5UKc3GvpLxhwpqww,点击链接查看更多技术内容.   [开发者说]栏目是为HarmonyOS开发者提供的展示和分享 ...

  6. Hive 查看,删除分区

    查看所有分区 show partitions 表名; 删除一般会有两种方案 1.直接删除hdfs文件 亲测删除hdfs路径后 查看分区还是能看到此分区 可能会引起其他问题 此方法不建议 2. 使用删除 ...

  7. tracer 原理

    前言 准备整理网络章节,先整理概念. tracer 是一个可以获取我们的主机到访问端中间经过了哪些路由,这个对于我们非常重要,看下原理吧. 正文 tracer 在unix中是tracerRout. 它 ...

  8. Reinforcement Learning (DQN) 中经验池详细解释

    一般DQN中的经验池类,都类似于下面这段代码. import random from collections import namedtuple, deque Transition = namedtu ...

  9. EPLAN电气绘图笔记

    EPLAN的背景由来发展意义 使用软件的一些思维上规则的东西. 引入一些新的概念性名词术语及区分介绍. 如何完成项目式交付初级标准电气图纸. 如何高效简化. eplan安装后数据库问题. 6.安装后无 ...

  10. docker安装mysql8.0.20并远程连接

    前言 今天docker安装mysql8.0.20捯饬了半天,主要是挂载问题和连接问题,索性记录一下.网上很多千篇一律,还有很多就是过时了,那还是我自己上场吧.大家看的时候,请睁大眼睛,按步骤来. Do ...