快速排序|学习笔记

简介: 快速学习快速排序

开发者学堂课程【你的第一门 C 语言课:快速排序】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/444/detail/5485


快速排序


目录:

一、分治法

二、排序

三、快速排序法


一、分治法

1、分治法

(1)、大事化小,小事化了:把一件事情,分成各个小部分,在进行处理。

(2)、递归就是分治法的实现。把一个大的问题分成若干个小的问题,再把小的问题分成更小的问题,直到不能再分,从最简单的那个问题入手解决,层层回归,到最后大问题自然也就解决了。

(3)、例子:

比如国家要统计 GDP 总和,而你是这件事的负责人,你可以怎么做?可以找一张大的中国地图,然后自东向西、从南到北派下属去遍历每一寸国土,最后把所有的GDP 加起来就是一个总和。

但是这个很耗费物力人力,不建议这样做。那在现实中,可以将国家分成各个省市,再把省市分成各个区县。区县再分为乡镇,从乡镇开始统计,层层统计,向上汇报,最后加起来就是整个国家 GDP 的总和。这就是分治事项。如果要对整个国家的 GDP 进行排名,那么就需要排序算法了,以下以此为论点展开讲述。

 

二、排序

1、排序就是将一堆零零散散的数据重大到小、从小到大排成一个序列。

2、排序用的地方很多:

例如:

(1)期末考试老师要给所有同学的成绩进行一个排序,排出前几名拿奖学金和后几名叫家长;

(2)打开招聘网站经常就会优先考虑待遇较高的或者待遇较低的职位,肯定是待遇较高的,那么就应该对薪酬从高到低进行排序;

(3)在淘宝中购买化妆品,但不知道哪一款合适,所以可以点销量进行排序;

(4)排序的方法有很多,比如,耳熟能详的冒泡排序、鸡尾酒排序、插入排序、选择排序、快速排序等。

 

三、快速排序算法

1、快速排序是20世纪十大算法之一。

快速排序算法的基本思想是:通过一趟排序将待排序数据分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,重复上述步骤直到排序完成。

图片46.png

1) 现在就要把他分割成两部分,然后就需要去找基准点 ,起始是0,最后是9,(0+9)/2=4,那么下标就应该是4的位置,然后选择中间元素7作为基准点。

2) i 是从左往右走的下标,j 是从右往左走的下标,从左往右找到大于等于基准点的元素。

3) 从右到左找到小于等于基准点的元素。

4) 两个元素进行互换

5) 从左往右找到大于等于基准点的元素

6) 从右往左找打小于等于基点的元素

7) 两个元素进行互换

8) 从左往右找到大于等于基点的元素

从右往左找打小于等于基点的元素

9) 两个元素进行互换

10) 一直重复这三个相同的步骤,直到 i > j。第一趟结束

11) 按照第一趟的方法递归左边和右边两个例子

12) 排序完成

实现代码:

#include

void quick_sort(int array[], int Left, int right )

{

inti=left,j=right;

int temp;

int pivot ;

pivot = array[(Left + right) / 2];

while (i <= j)

{

//从左到右找到大于等于基准点的元素

while (array[i] < pivot)

i++;

}

//从右到左找到小于等于基准点的元素

while (array[j] > pivot)

{

j--;

}

//如果主<= j,则互换

if(i<=j)

{

temp = array[i];

array[i] = array[j] ;

arraylj] = temp;

i++ ;

j-- ;

}

}

if (Left < i)

{

quick_ sort(array, Left, j) ;

}

if (i < right)

{

quick_ sort(array, i, right) ;

}

int main( void)

{

int array[] = {73, 108, 111, 118, 101, 70, 105,115, 104,67,46,99,111, 109};

int i, Length ;

Length = sizeof(array) / sizeof(array[0]);

quick sort(array, 0, length-1);

printf("排序后的结果是: ");

for (i = 0; i < Length; i++)

{

printf("Sd ”,array[i]);

}

putchar('\n')

return 0 ;

}

运行:gcc quick sort.c && ./a. out

排序后的结果效果图:

图片47.png

序列被分为两个序列,左边的都小于等于基点,右边的大于等于基点,然后进行递归。

相关文章
|
2月前
|
算法 C++
c++算法学习笔记 (1)快速排序
c++算法学习笔记 (1)快速排序
|
2月前
|
人工智能 算法 C++
c++算法学习笔记 (2)归并排序
c++算法学习笔记 (2)归并排序
|
2月前
|
存储 算法 搜索推荐
【数据结构与算法】:选择排序与快速排序
欢迎来到排序的第二个部分:选择排序与快速排序!
【数据结构与算法】:选择排序与快速排序
|
2月前
|
算法 索引
【数据结构与算法】:非递归实现快速排序、归并排序
上篇文章我们详细讲解了递归版本的快速排序,本篇我们来探究非递归实现快速排序和归并排序
【数据结构与算法】:非递归实现快速排序、归并排序
|
2月前
|
搜索推荐
排序算法-快速排序
排序算法-快速排序
21 0
|
2月前
|
存储 搜索推荐 算法
排序算法——快速排序
排序算法——快速排序
|
2月前
|
存储 搜索推荐
常见排序算法原理及实现——第二部分(归并排序、快速排序、堆排序)
常见排序算法原理及实现——第二部分(归并排序、快速排序、堆排序)
|
9月前
|
搜索推荐
排序算法之【快速排序】
排序算法之【快速排序】
39 0
|
10月前
|
算法 搜索推荐 C++
【C++】快速排序的学习和介绍
【C++】快速排序的学习和介绍
72 0
|
搜索推荐 Java