快速排序
基本思想
快速排序的基本思想就是寻找一个轴值,此轴值将待排序数列分成两部分,左侧的数据均小于轴值,右侧的数据均大于轴值,在从左右两侧分别找取各自的轴值,很明显用到了递归的思想,此文轴值的寻找方法为去待排数据的第一个元素。
如何将轴值(第一个数据)放到正确的位置上
以正向排序(自小到大)为例,将first指向待排数据的第一个元素,last指向最后一个元素,保持first不动,将last从待排数据的末尾向前推进,直到first指向的值大于last指向的值,然后将first指向的值和last指向的值交换位置,但保持first与last不变,再保持last的值不变,将first的值向后推进,直到first指向的值大于last指向的值,然后将first指向的值和last指向的值交换位置,但保持first与last不变,一直重复下去,直到first大于或等于last。
以下为完整代码
#include<stdio.h>
//将轴值(第一个数据)放到正确的位置上
int Part(int arr[],int first,int last) {
int i = first,j = last,temp;
while(i < j) {
while(i < j&&arr[j] >= arr[i]) j--;
if(i < j) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
i++;
}
while(i < j&&arr[j] >= arr[i]) i++;
if(i < j) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
j--;
}
}
return i;
}
void Quck(int arr[],int first,int last) {
if(first >= last) return;
else {
//轴值将待排数据分成两个部分,依次对每个小部分进行排序
int pivot = Part(arr,first,last);
Quck(arr,first,pivot-1);
Quck(arr,pivot+1,last);
}
}
int main() {
int arr[6] = {10,51,2,8,3,6},i;
Quck(arr,0,5);
for(i = 0;i < 6;i++) {
printf("%d ",arr[i]);
}
return 0;
}
版权声明:本文为qq_62388672原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。