为计算机专业大学生提供的c实现的快速排序算法
学习数据结构以及平时老师留的作业中有很多算法题,故分享给计算机专业在校朋友们代码,希望能帮助你理解然后完成作业考试。
算法思想:
给定一个数组,每次选取数组第一个位置作为枢轴元素,然后通过low和high两个变量,一个指向数组第一个位置,一个指向数组最后一个位置。
主要看我的代码,划分函数这个方法里面,每次我把array[low]赋值给provt,也就是枢轴元素,然后在low小于high的情况下执行内部两个while循环,因为已经把low位置的值充当枢轴元素了,所以其实这个时候其实array[low]里的值就相当于空了,因此我们的while循环是从后向前,先执行high--,(注意这个细节)找到比枢轴元素provit小的元素,就将其放到array[low]当中,这个时候array[high]的值也就相当于空了,然后执行第二个while循环,也就是比枢轴元素小的话就执行low++,找到比枢轴元素大的值就放到array[high]里,最后low和high相等跳出循环,确定枢轴元素的最终位置,以此类推,应该就可以看懂这个代码了,由于笔者水平有限,描述可能有不清晰的地方,大家可以评论留言互动。
#include <stdio.h>
#define SiZE 9
//输出函数
void DisPlay(int array[],int maxsise){
for(int i=0;i<maxsise;i++){
printf("%d ",array[i]);
}
printf("\n");
return;
}
//划分函数
int Partition(int array[],int low,int high){
int prvot = array[low];
while(low<high){
//比枢轴元素大的话就不操作,high--,
while(low<high&&array[high]>=prvot)
high--;
array[low]=array[high];//比枢轴元素小的移动到左端
//比枢轴元素小的话就不操作,low++,
while(low<high&&array[low]<=prvot)
low++;
array[high]=array[low];//比枢轴元素大的移动到右端
}
array[low]=prvot;//枢轴元素的最终位置
printf("这次充当枢轴元素的值和最终位置:%d %d\n",array[low],low+1);
DisPlay(array,SiZE);
return low;
}
//快速排序
void QuickSort(int array[],int low,int high){
if(low<high)
{
int pivotpos = Partition(array,low,high);//确定第一次划分枢轴元素的最终位置
QuickSort(array,low,pivotpos-1);//划分左子表
QuickSort(array,pivotpos+1,high);//划分右子表
}
}
int main(){
int array[SiZE] = {66,13,51,76,81,26,57,69,23};
printf("排序前:\n");
DisPlay(array,SiZE);
QuickSort(array,0,SiZE-1);
printf("排序后:\n");
DisPlay(array,SiZE);
}