常用排序方法之快速排序
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;
}
以上,就是我对于快速排序的理解,快速排序有一个限制,只适用于顺序表线性结构或数组序列的排序。不适用于在链表结构上实现排序
以上是关于常用排序方法之快速排序的主要内容,如果未能解决你的问题,请参考以下文章