常用排序方法之快速排序

Posted 大潘闲聊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用排序方法之快速排序相关的知识,希望对你有一定的参考价值。

    这几天在看排序,感觉到有点吃力,就想把学习的知识记录下来,用自己的话去理解它,仅供大家参考和以后自己复习用。

    快速排序是相对于冒泡排序来说较快速,快速排序的每一次移动都是跳跃式的,因为每趟排序都有一个基准点,把大于(小于)基准点的元素放前面,小于(大于)基准点的元素放后面,每次元素的移动是跳跃式的,而不像冒泡排序那样只能在相邻的元素之间进行,快速排序元素移动的间隔距离大,因此总的比较和移动次数就会减少,排序的速度自然也就快一点。

    快速排序的基本思想:在原始序列(k1,k2,k3....kn)中任意选取一个元素,作为基准元素,要求该元素的左边的元素都比它小(大),右边的元素都比它大(小),这样就确定了基准元素在排序后的最终位置,如果基准元素左(右)子序列的元素个数大于1,那么分别再次在左(右)子序列上进行基准元素确定和排序。直到所有元素都被移动到最终的位置上去

首先确定一个无序序列

常用排序方法之快速排序

确定基准元素

常用排序方法之快速排序

   步骤一

常用排序方法之快速排序

步骤一执行完毕后i j 的置位

常用排序方法之快速排序

步骤二:互换i j 所指向的值

常用排序方法之快速排序

如果i < j 重复执行步骤一、步骤二

步骤三:基准元素与 j 所指向元素进行互换

再重复执行以上三个步骤,以确定每个元素的最终位置

/*

编写一个C程序,实现数据序列

{2,5,6,3,7,8,0,9,12,1}的快速排序,从小到大输出

*/

# include<stdio.h>


void swap(int *a, int *b)

{

int tmp;

tmp = *a;

*a = *b;

*b = tmp;

}


//快速排序,需要接收数组,s代表数组第一个元素的下标,t代表数组最后一个元素的下标

void quick_sort(int A[], int s, int t)

{

int i, j;

if (s < t)

{

i = s;

j = t + 1;//因为是do-while循环,要先执行j--,如果传t的话,最后一个元素就没有进行排序

while (1)

{

do i++;

//当i指向元素大于等于基准元素时或i指向最后一个元素时,退出循环

while (!(A[s] <= A[i] || i == t));

do j--;

//当j指向元素小于等于基准元素时或j指向第一个元素时,退出循环

while (!(A[s] >= A[j] || j == s));

//如果i小于j时,把i所指向元素和j所指向元素进行互换

if (i < j)

swap(&A[i], &A[j]);

else

break;

}

swap(&A[s], &A[j]);

quick_sort(A, s, j - 1);//递归基准元素左子序列

quick_sort(A, j + 1, t);//递归基准元素右子序列


}

}


int main(void)

{

int A[10] = { 2, 5, 6, 3, 7, 8, 0, 9, 12, 1 };

int i;


printf("原数组元素内容为:\n");

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

{

printf("%d,",A[i]);

}

printf("\n");


quick_sort(A, 0, 9);


printf("快速排序后元素内容为:\n");

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

{

printf("%d,", A[i]);

}

printf("\n");


return 0;

}

    以上,就是我对于快速排序的理解,快速排序有一个限制,只适用于顺序表线性结构或数组序列的排序。不适用于在链表结构上实现排序

以上是关于常用排序方法之快速排序的主要内容,如果未能解决你的问题,请参考以下文章

分治法应用之二分查找 快速排序递归排序

常用算法的简洁代码实现之快速排序归并排序

常用算法Java实现之快速排序

java 交换排序之(冒泡排序快速排序)

排序方法之五:快速排序

Java学习笔记之十一Java中常用的8大排序算法详解总结