快速排序算法-C语言实现

注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序。同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现。按照功能进行模块划分的思想得到了彻底地贯彻。

 

以下内容翻译自:

 

  1. http://cprogramminglanguage.net/quicksort-algorithm-c-source-code.aspx

 

 

译文:

在快速排序算法中,使用了分治策略。首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束。

 

步骤如下:

 

在序列中选择一个关键元素做为轴;

 

对序列进行重新排序,将比轴小的元素移到轴的前边,比轴大的元素移动到轴的后面。在进行划分之后,轴便在它最终的位置上;

 

递归地对两个子序列进行重新排序:含有较小元素的子序列和含有较大元素的子序列。

 

下面的动画展示了快速排序算法的工作原理。

 快速排序算法-C语言实现

快速排序图示:可以图中在每次的比较选取的key元素为序列最后的元素。

 

#include <stdio.h>

#include <stdlib.h> 



void swap(int *x,int *y)

{

   int temp;

   temp = *x;

   *x = *y;

   *y = temp;

}



int choose_pivot(int i,int j )

{

   return((i+j) /2);

}



void quicksort(int list[],int m,int n)

{

   int key,i,j,k;

   if( m < n)

   {

      k = choose_pivot(m,n);

      swap(&list[m],&list[k]);

      key = list[m];

      i = m+1;

      j = n;

      while(i <= j)

      {

         while((i <= n) && (list[i] <= key))

                i++;

         while((j >= m) && (list[j] > key))

                j--;

         if( i < j)

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

      }

     // 交换两个元素的位置

      swap(&list[m],&list[j]);

     // 递归地对较小的数据序列进行排序

      quicksort(list,m,j-1);

      quicksort(list,j+1,n);

   }

}



void printlist(int list[],int n)

{

   int i;

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

      printf("%d\t",list[i]);

}



void main()

{

   const int MAX_ELEMENTS = 10;

   int list[MAX_ELEMENTS];



   int i = 0;

   

   // 产生填充序列的随机数

   for(i = 0; i < MAX_ELEMENTS; i++ ){

     list[i] = rand();

   }

   printf("进行排序之前的序列:\n");

   printlist(list,MAX_ELEMENTS);

   

   // sort the list using quicksort

   quicksort(list,0,MAX_ELEMENTS-1);



   // print the result

   printf("使用快速排序算法进行排序之后的序列:\n");

   printlist(list,MAX_ELEMENTS);

}

 

 

 

你可能感兴趣的:(快速排序)