顺序表的快速排序

用c语言建立顺序表,实现快速排序。

这里是用了两个函数实现的,一个分割函数,一个递归。

#include<stdio.h>
#define ListSize 20
typedef int DataType;
typedef struct{
	DataType data[ListSize];
	int length;
}Seqlist;

Seqlist CreateList(Seqlist L)  //结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数,不过可以return返回它
{
    int n;
    L.length=0;
    printf("输入顺序表的数据:输入-1结束\n");
	while(1)
    {
        scanf("%d",&n);
        if(n==-1) break;
        L.data[L.length]=n;
        L.length++;
    }
    return L;
}

void DisplayList(Seqlist *L)
{
    int i;
    for(i=0;i<L->length;i++)
    {
        printf("%d,",L->data[i]);
    }
    printf("\n");
}

int Patition(Seqlist *L,int low,int high)  //把顺序表一分为二,并且返回枢轴位置
{
    DataType pivotvalue=L->data[low];    //用第一个数作为枢轴,pivotvalue保存枢轴的值
    while(low<high)   //当low==high时两边相遇了,结束一趟排序
    {
        while(low<high&&L->data[high]>=pivotvalue)  //先从右往左找比pivotvalue小的数, 
                                                    //注意等号
            high--;
        L->data[low]=L->data[high];             //找到后放到前边

        while(low<high&&L->data[low]<=pivotvalue)  //从前往后找比pivotvalue大的数
            low++;
        L->data[high]=L->data[low];   //放到后边

    }
    L->data[low]=pivotvalue; //枢轴此时放到low和high相遇的地方
    return low;  //返回枢轴位置

}
void ListQSort(Seqlist *L,int low,int high)  //快排
{

    if(low<high)
    {
        int pivotlocation = Patition(L, low, high);
        ListQSort(L,low,pivotlocation-1);
        ListQSort(L,pivotlocation+1,high);
    }

}

int main()
{
    int i,n;
    Seqlist mylist;
    mylist=CreateList(mylist);

	DisplayList(&mylist);
	printf("长度:%d\n",mylist.length);
	ListQSort(&mylist,0,mylist.length-1);
	DisplayList(&mylist);
}

接着用一个函数来实现吧,原理是一样的,但是要注意low和high的初始值得保留。

void QuickSort(Seqlist *L,int low,int high)
{
    int i=low,j=high;  //low和high的位置待会递归的时候要用到,所以不能和上边一样直接修改
    DataType pivotvalue=L->data[i];  //注意这里要用data[i]
    if(low>=high)  //一趟排序结束
        return;   
    while(i<j)
    {
        while(i<j&&L->data[j]>=pivotvalue)
            j--;
        L->data[i]=L->data[j];
        while(i<j&&L->data[i]<=pivotvalue)
            i++;
        L->data[j]=L->data[i];
    }
    L->data[i]=pivotvalue;
    QuickSort(L,low,i-1);
    QuickSort(L,i+1,high);
}

猜你喜欢

转载自blog.csdn.net/weixin_38345919/article/details/81322145