学习数据结构以及平时老师留的作业中有很多算法题,故分享给计算机专业在校朋友们代码,希望能帮助你理解然后完成作业考试。
给定一个数组,每次选取数组第一个位置作为枢轴元素,然后通过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); }