本帖最后由 楚燮哥哥 于 2014-11-23 15:37 编辑
刚学C语言,实现起来有点勉强,有什么可以优化的地方还请各位大神指出
#include<stdio.h>
//输出数组
void printNum(int s[],int len);
//交换两个变量的值
void swap(int *a,int *b);
//选择排序
void selectSort(int s[],int len);
//冒泡排序
void bubbleSort(int s[],int len);
//快速排序
int Partition(int r[],int first,int end);
void QuickSort(int r[],int first,int end);
int main()
{
int s[5]={2,5,3,1,4};
//选择排序
// selectSort(s,5);
//冒泡排序
// bubbleSort(s,5);
//快速排序
QuickSort(s,0,4);
printNum(s,5);
return 0;
}
void printNum(int s[],int len)
{
for(int i=0;i<len;i++)
{
printf("%d ",s);
}
printf("\n");
}
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
/**逐个比较,每一次把最小的依次往前面放*/
void selectSort(int s[],int len)
{
for(int i=0;i<len;i++)
{
for(int j=i;j<len;j++)
{
if(s>s[j])
swap(&s,&s[j]);
}
}
}
/**先将第一个值和第二个值比较,如果第一个值大于第二个值则互相交换,然后比较第二个和第三个依次类推,目的是将最大的值往后面放*/
void bubbleSort(int s[],int len)
{
int i,j;
for(i=0;i<len;i++)
{
for(j=0;j<len-i;j++)
{
if(s[j]>s[j+1])
swap(&s[j],&s[j+1]);
}
}
}
/**取序列的中间值*/
int Partition(int r[],int first,int end)
{
int temp = 0;
int i=first;
int j=end;
while(i<j)
{
//右侧扫描,直到结束或者r>r[j]
while(i<j&&r<=r[j])
j--;
//交换两个值
if(i<j)
{
swap(&r[j],&r);
i++;
}
//进行左侧扫描
while(i<j&&r<=r[j])
i++;
if(i<j)
{
swap(&r[j],&r);
j--;
}
}
return i; //i为轴值记录的最终位置
}
/**利用递归的思想,不停的对数组进行划分排序*/
void QuickSort(int r[],int first,int end)
{
if(first<end)
{
int pivot=Partition(r,first,end); //一次划分结束
QuickSort(r,first,pivot-1); //对左侧序列进行快速排序
QuickSort(r,pivot+1,end);
}
}
|