首页 > 代码库 > 快速排序算法-C语言实现

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

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

 

以下内容翻译自:

 

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

 

 

译文:

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

 

步骤如下:

 

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

 

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

 

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

 

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

 

快速排序图示:可以图中在每次的比较选取的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);}