-
首先设置两个变量i,j。
分别指向序列的首尾元素。
-
该例子是以第一个元素为基准,从小到大进行排列,这里的例子中的基准值就是66。
让j从后向前进行查询,直到找到第一个小于66的元素。
则将最后一个j指向的数23,和i指向的66交换位置。
然后将i从前向后查询,直到找到第一个大于66的元素76.
-
将76和66位置互换。
让j从后向前进行查询,直到找到第一个小于66的元素57
-
将57和66交换位置。
-
然后将i从前向后查询,直到找到第一个大于66的元素81.
-
将81和66交换位置。
让j从后向前进行查询,直到找到第一个小于66的元素26
-
将26和66交换位置。
此时i,j都同时指向了目标元素66.
查找停止。
- 所得到的序列就是第一趟排序的序列,使得左边的数都小于基准数66,右边的数都大于基准数66,左边和右边分别作上述的相同的排序操作。
-
附上一段代码:
#include <stdio.h>
#include <stdlib.h>
/*
快速排序算法学习
*/
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void quickSort(int arr[] ,int i, int j)
{
int arrBase;
int tempi = i,
tempj = j;
//对于这种递归的函数,内部必须要有一个函数返回的条件
if(tempi >= tempj)
return;
//拷贝一个基准值作为后面比较的参数
arrBase = arr[i];
while(i < j)
{
while(i < j && arr[j] > arrBase)
j--;
if(i < j)
{
swap(&arr[i], &arr[j]);
i++;
}
while(i < j && arr[i] < arrBase)
i++;
if(i < j)
{
swap(&arr[i], &arr[j]);
j--;
}
}
arr[i] = arrBase;
//分治方法进行递归
quickSort(arr,tempi,i-1);
quickSort(arr,i+1,tempj);
}
int main()
{
int myArr[] = {12,13,15,20,0,-1,-10,100};
int arrLength = sizeof(myArr)/sizeof(int);
quickSort(myArr,0,arrLength-1);
int i = 0;
for(; i<arrLength; i++)
printf("%5d",myArr[i]);
printf("\n");
return 0;
}
上述代码算法实现中有一定的优化,如将a[i]作为定子比较时发现,a[i]>a[j],i++;
经验证发现arrBase不是必要的;
代码在做while 循环时写法过于啰嗦,逻辑不清。
优化后的代码:
#include <stdio.h>
#include <stdlib.h>
/*
快速排序算法
*/
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void quickSort(int arr[] ,int i, int j)
{
int tempi = i,
tempj = j;
//对于这种递归的函数,内部必须要有一个函数返回的条件
if(tempi >= tempj)
return;
while(i < j)
{
while(i < j)
{
if(arr[i] > arr[j])
{
swap(&arr[i], &arr[j]);
break;
}
j--;
}
while(i < j)
{
if(arr[i] > arr[j])
{
swap(&arr[i], &arr[j]);
break;
}
i++;
}
}
//分治方法进行递归
quickSort(arr,tempi,i-1);
quickSort(arr,i+1,tempj);
}
int main()
{
int myArr[] = {12,13,15,20,0,-1,-10,100,50,3,8};
int arrLength = sizeof(myArr)/sizeof(int);
quickSort(myArr,0,arrLength-1);
int i = 0;
for(; i<arrLength; i++)
printf("%5d",myArr[i]);
printf("\n");
return 0;
}