快速排序的三个步骤
1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot);
2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大;
3) 递归地对两个序列进行快速排序,直到序列为空或者只有一个元素;
i = j = 2, 这样序列就这样分割成了两部分,左边部分{20, 10} 均小于 基准值(30);右边部分 {60, 40,50}均大于基准值。
这样子我们就达到了分割序列的目标。再接着对左右子序列分别用同样的办法进行分割,直至左右子序列不超过一个元素,那么排序结束,整个序列处于有序状态。
<?php
//快速排序
header("content-type:text/html;charset=utf-8");
function quick_sort($arr,$left,$right)
{
if ($left>=$right)
{
//var_dump($arr);
return ;
}
$i = $left;
$j = $right;
$temp= $arr[$left];
while ($i != $j)
{
while($i < $j && $arr[$j] >= $temp) // 从右向左找第一个小于x的数
$j--;
if($i < $j)
$arr[$i] = $arr[$j];
while($i < $j && $arr[$i] < $temp) // 从左向右找第一个大于等于x的数
$i++;
if($i < $j)
$arr[$j] = $arr[$i];
}
$arr[$i] = $temp;
quick_sort(&$arr, $left, $i - 1); // 递归调用
quick_sort(&$arr, $i + 1, $right);
}
$list = array('23','38','22','45','23','67','31','15','41');
quick_sort(&$list,0,8);
var_dump($list);
c语言版本
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
//快速排序算法
void quick_sort(int *arr,int left,int right)
{
int i,j,tmp;
if (left>=right)
{
return ;
}
i = left;
j = right;
tmp = arr[i];
while (i != j)
{
while(i < j && arr[j] >= tmp) // 从右向左找第一个小于tmp的数
j--;
if(i < j)
arr[i] = arr[j];
while(i < j && arr[i] < tmp) // 从左向右找第一个大于等于tmp的数
i++;
if(i < j)
arr[j] = arr[i];
}
arr[i] = tmp;
quick_sort(arr, left, i - 1); // 递归调用
quick_sort(arr, i + 1,right);
}
int main()
{
int array[] = {30,40,60,10,20,50};
quick_sort(array,0,5);
printArray(array,6);
system("pause");
return 0;
}