c语言快速排序算法

Posted 小谈编程

tags:

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

快速排序算法
快速排序(Quicksort)是对冒泡排序的一种改进。

快速排序由C. A. R. Hoare1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。举例说明一下吧,这个可能不是太好理解。假设要排序的序列为

2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2552大,j左移

2 2 4 9 3 6 7 1 5 比较211小于2,所以把1放在2的位置

2 1 4 9 3 6 7 1 5 比较244大于2,因此将4移动到后面

2 1 4 9 3 6 7 4 5 比较27262329,全部大于2,满足条件,因此不变

经过第一轮的快速排序,元素变为下面的样子

[1] 2 [4 9 3 6 7 5]

之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。

代码实现
#include <bits/stdc++.h>

using namespace std;

void P(int a[],int n)

{

   for(int i=0; i<n; i++)

       cout<<a[i]<<" ";

   cout<<endl;

}

void quick_sort(int s[], int l, int r)

{

   if (l < r)

    {

       //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1

       int i = l, j = r, x = s[l];

       while (i < j)

       {

           while(i < j && s[j] >= x) // 从右向左找第一个小于x的数

                j--;

           if(i < j)

                s[i++] = s[j];

 

           while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数

                i++;

           if(i < j)

                s[j--] = s[i];

       }

       s[i] = x;

       quick_sort(s, l, i - 1); // 递归调用

       quick_sort(s, i + 1, r);

    }

}

int main()

{

   //int a[]= {72,6,57,88,60,42,83,73,48,85};

   int a[]= {10,9,8,7,6,5,4,3,2,1};

   P(a,10);

    quick_sort(a,0,9);//注意最后一个参数是n-1!!!!!

   P(a,10);

   return 0;

}

 


以上是关于c语言快速排序算法的主要内容,如果未能解决你的问题,请参考以下文章

用C语言编写函数,要实现快速排序算法或者冒泡法

c语言快速排序算法

C语言快速排序代码

C语言-排序算法——快速排序

C语言快速排序算法及代码

菜鸟提问 c语言关于快速排序