基于C语言的快速排序代码分析
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
void swap(int *a,int *b){
if(*a==*b){//异或交换如果相同会一直为0
return;
}
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
void quicksort(int *array,int left,int right){
if(left>=right){ //当开始下标大于或者等于借宿下标时 此时说明没有只有一个元素或者传值错误,直接退出
return;
}
int tmpleft=left;//begin 设定临时开始下标
int tmpright=right;//end 设定临时结束下标
int key=tmpleft; //设定排序key 此处使用临时开始下标
while(tmpleft<tmpright){ //当临时开始下标大于临时结束下标时进行循环(说明:循环体内进行两个临时变量的遍历)
while(array[tmpright]>=array[key]&&tmpright>tmpleft){//右半边逐个查找
//如果临时结束变量的数组值大于或者等于key变量的数组值 并且临时结束变量大于临时开始变量 代表此临时结束变量的数组值比key代表的数组值大
tmpright--; //临时结束变量向左移动,即临时结束变量往前移位
}
while(array[tmpleft]<=array[key]&&tmpleft<tmpright){//左半边逐个查找
tmpleft++; //临时开始变量向右移动,即临时开始变量往后移位
}
swap(&array[tmpleft],&array[tmpright]); //交换临时开始变量和临时结束变量代表的数组值
}
//跳出当前循环后,说明临时开始下标和临时借宿下标相遇,代表此key的一轮排序已完成
swap(&array[tmpleft],&array[key]);//在此交换key与临时开始变量,因为是以临时开始变量为key值进行交换,所以最后它的位置应该在最中间,左边都是比它小的,右边都是比它大的
//(key这个值一直是最左的,临时开始变量是一直加的,到后面是临时开始变量到了最中间,所以key要跟它做位置互换,因为在这里是以key值为基准的左右对比)
quicksort(array,left,tmpleft-1); //以最初变化后的左边进行相同的排序 (传值:刷组,数组开始下标,上一轮key值-1)
quicksort(array,tmpleft+1,right); //以最初变化后的右边进行相同的排序 (传值:数组,上一轮key值+1,数结束下标)
}
int main(){
int array[]={1,4,6,8,234,65,78,1123,56,5767,345,234,457,456,232,345,6};
int length=sizeof(array)/sizeof(array[0]);
quicksort(array,0,length-1);//传入数组,开始下标,结束下标
for (int i = 0; i < length; ++i)
{
printf("array[%d]=%d\n",i,array[i] ); /* code */
}
return 0;
}