数据结构之快速排序:
算法思想:
在待排序表中选择一个元素pivot作为基准,通过一趟排序将待排序表划分为两个独立的两部分,L[0~k-1]和L[k+1~length],使得L[0~k-1]的元素均小于pivot,L[k+1~length]的元素均大于pivot。此时,pivot放在了排序的最终位置上,这是一趟快速排序。
在递归的对L[0~k-1]、L[k+1~length]进行排序,当每部分只有一个元素或空,为止。此时,每个元素都放在了最终的位置上。
代码:
#include<stdio.h>
#define ElemType int
#define maxsize 20
typedef struct{
ElemType data[maxsize];
int length;
}sqlist;
int flag=0; //用来计数,表示排序次数
//------------------------打印顺序表的元素--------------------------------
void printElem(sqlist* l)
{
int i=0;
for(i=0;i<l->length;i++)
printf("%d ",l->data[i]);
printf("\n");
}
//---------------------------划分函数-------------------------------------
int Partition(sqlist* l,int low,int high)
{
ElemType pivot=l->data[low];
while(low<high) //low>=high时跳出循环
{
while(low<high&&l->data[high]>=pivot)
--high;
l->data[low]=l->data[high]; //将比枢轴值小的元素移动到左端
while(low<high&&l->data[low]<=pivot)
++low;
l->data[high]=l->data[low]; //将比枢轴值大的元素移动到右端
}//while
l->data[low]=pivot; //将枢轴元素放到最终位置
printf("第%d次快速排序的结果为:\n",++flag);
printElem(l);
return low; //返回存放枢轴的最终位置
}
//---------------------------排序函数-------------------------------------
void QuickSort(sqlist* l,int low,int high)
{
if(low<high)
{
int pivotpos=Partition(l,low,high);
QuickSort(l,low,pivotpos-1); //递归对左边的子表排序
QuickSort(l,pivotpos+1,high); //递归对右边的子表排序
}
} //QuickSort
int main()
{
sqlist ll;
ll.length=0;
int i=0;
for(i=0;i<maxsize;i++)
{
ll.data[i]=rand()%100;
ll.length++;
}
printf("未排序的顺序表\n");
printElem(&ll);
QuickSort(&ll,0,ll.length-1);
}
运行结果: