快速排序代码实现
代码如下:
1 #include<stdio.h> 2 //快速排序函数,形参列表为数组,左指针位置,右指针位置,int *arr等价于int arr[] 3 void QkSort(int *arr, int left, int right){ 4 if (left > right) //左指针位置必须大于右指针位置 5 { 6 return; 7 } 8 //变量tmp为基准数,在此规定基准数为序列的第一个数,即左指针指向的数 9 int tmp = arr[left]; 10 int i = left; //左指针 11 int j = right; //右指针 12 //外循环,直到左指针和右指针相等时退出,表示根据当前基准数以完成当前序列排序 13 while (i != j) 14 { //内循环1,寻找到比基准数小的数时退出循环,此循环控制右指针 15 while (arr[j] >= tmp && j > i) 16 { 17 j--; 18 } 19 //内循环2,寻找到比基准数大的数时退出循环,此循环控制左指针 20 while (arr[i] <= tmp && j > i) 21 { 22 i++; 23 } 24 //经过以上两个内循环后,此时的左指针和右指针分别指向了 25 //比基准数小和比基准数大的数 26 //接下来要将这两个指针的数据进行交换 27 if (j > i)//交换前判断右指针是否大于左指针 28 { 29 int t = arr[i]; 30 arr[i] = arr[j]; 31 arr[j] = t; 32 } 33 }//外循环尾 34 35 //执行完循环后,就找到了基准数的排序位置,将基准数tmp与i位置进行交换 36 arr[left] = arr[i]; 37 arr[i] = tmp; 38 //********************************************* 39 //下面的程序为递归,可能存在多层递归调用 40 //********************************************* 41 //此时的数组分为了两部分,基准数左边都是小于基准数的,右边都是大于基准数的, 42 //现在进行递归,对基准数左边的数进行排序,此时递归可能会有多层 43 QkSort(arr, left, i - 1); 44 //进行到这步时,基准数左边已经全部有序,而右边还未进行排序, 45 //现在进行递归,对基准数右边的数据进行排序,此时递归可能有多层 46 QkSort(arr, i + 1, right); 47 } 48 49 int main() 50 { 51 int arr[] = { 0, 4, 3, 5, 65, 2, 64, 68, 34, 94, 53, 74, 13 }; 52 int len = sizeof(arr)/sizeof(int); 53 printf("待排序数值: "); 54 for (int i = 0; i <=len-1; i++) 55 { 56 printf("%d ",arr[i]); 57 } 58 printf("\n"); 59 printf("排序后的数值:"); 60 QkSort(arr,0,len-1);//调用快速排序函数 61 for (int i = 0; i <=len-1; i++) 62 { 63 printf("%d ", arr[i]); 64 } 65 printf("\n"); 66 }
最终实现结果:
简化code,去除注释,快速排序算法,如下:
1 void QkSort(int *arr, int left, int right){ 2 if (left > right) 3 { 4 return; 5 } 6 unsigned int loopNo = 0; 7 int tmp = arr[left]; 8 int i = left; 9 int j = right; 10 while (i != j) 11 { 12 while (arr[j] >= tmp && j > i) 13 { 14 j--; 15 } 16 while (arr[i] <= tmp && j > i) 17 { 18 i++; 19 } 20 if (j > i) 21 { 22 int t = arr[i]; 23 arr[i] = arr[j]; 24 arr[j] = t; 25 } 26 27 } 28 arr[left] = arr[i]; 29 arr[i] = tmp; 30 QkSort(arr, left, i - 1); 31 QkSort(arr, i + 1, right); 32 }