首页 > 代码库 > 各种排序_续()

各种排序_续()

例一:快速排序

#include <stdio.h>int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置  {      int i = l, j = r;      int x = s[l]; //s[l]即s[i]就是第一个坑      while (i < j)      {          // 从右向左找小于x的数来填s[i]          while(i < j && s[j] >= x)               j--;            if(i < j)           {              s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑              i++;          }            // 从左向右找大于或等于x的数来填s[j]          while(i < j && s[i] < x)              i++;            if(i < j)           {              s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑              j--;          }      }      //退出时,i等于j。将x填到这个坑中。      s[i] = x;        return i;  }  void quick_sort1(int s[], int l, int r)  {      if (l < r)      {          int i = AdjustArray(s, l, r);//先成挖坑填数法调整s[]          quick_sort1(s, l, i - 1); // 递归调用           quick_sort1(s, i + 1, r);      }  }  int main(){    int array[10]={1,2,3,9,8,7,5,6,4,12};    quick_sort1(array,0,9);    int i;    for(i=0;i<10;i++)    {    printf("%d ",array[i]);            }                return 0;}

参考原文:http://blog.csdn.net/morewindows/article/details/6684558

例二:快速排序优化版

#include <stdio.h>//快速排序  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--                 j--;                if(i < j)                   s[i++] = s[j];                            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数,反而是i++                           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 array[10]={1,2,3,9,8,7,5,6,4,12};    quick_sort(array,0,9);    int i;    for(i=0;i<10;i++)    {    printf("%d ",array[i]);            }                return 0;}

 

各种排序_续()