C/C++程序员:基本排序算法之快速排序
2014-04-29 09:37
260 查看
快速排序
10 80 30 60 50 40 70 20 90
^
10 30 40 20 50 70 90 80 60
^ ^
10 20 30 40 50 70 60 80 90
1)算法
A.从待排序序列中任意选择一个元素,作为基准;
B.将所有小于基准的元素放在基准之前,大于基准的元素放在
基准之后,等于基准的元素放在基准之前或之后,这个过程
成为分组;
C.以递归的方式,分别对基准之前和基准之后的分组继续进行
分组,直到每个分组内的元素个数不多于一个为止。
就地分组:
50
10 20 30 40 50 80 70 60 90
i
p
j
2)评价
A.平均时间复杂度:O(NlogN)
B.非稳定排序。
C.如果每次都能均匀分组,可以达到最快的排序效果。选择中间
位置作为基准,产生均匀分组的概率最高。
#include <stdio.h>
#include <stdlib.h>
/* 快速排序 */
void quick_sort (int data[], size_t left,
size_t right) {
size_t p = (left + right) / 2;
int pivot = data[p];
size_t i = left, j = right;
while (i < j) {
for (; ! (i >= p || pivot < data[i]); ++i);
if (i < p) {
data[p] = data[i];
p = i;
}
for (; ! (j <= p || data[j] < pivot); --j);
if (j > p) {
data[p] = data[j];
p = j;
}
}
data[p] = pivot;
if (p - left > 1)
quick_sort (data, left, p - 1);
if (right - p > 1)
quick_sort (data, p + 1, right);
}
/* 测试用例 */
int main (void) {
srand (time (NULL));
int data[10];
size_t i, size = sizeof(data) / sizeof(data[0]);
for (i = 0; i < size; ++i)
printf ("%2d ", data[i] = rand () % 100);
printf ("\n");
quick_sort (data, 0, size - 1);
for (i = 0; i < size; ++i)
printf ("%2d ", data[i]);
printf ("\n");
return 0;
}
10 80 30 60 50 40 70 20 90
^
10 30 40 20 50 70 90 80 60
^ ^
10 20 30 40 50 70 60 80 90
1)算法
A.从待排序序列中任意选择一个元素,作为基准;
B.将所有小于基准的元素放在基准之前,大于基准的元素放在
基准之后,等于基准的元素放在基准之前或之后,这个过程
成为分组;
C.以递归的方式,分别对基准之前和基准之后的分组继续进行
分组,直到每个分组内的元素个数不多于一个为止。
就地分组:
50
10 20 30 40 50 80 70 60 90
i
p
j
2)评价
A.平均时间复杂度:O(NlogN)
B.非稳定排序。
C.如果每次都能均匀分组,可以达到最快的排序效果。选择中间
位置作为基准,产生均匀分组的概率最高。
#include <stdio.h>
#include <stdlib.h>
/* 快速排序 */
void quick_sort (int data[], size_t left,
size_t right) {
size_t p = (left + right) / 2;
int pivot = data[p];
size_t i = left, j = right;
while (i < j) {
for (; ! (i >= p || pivot < data[i]); ++i);
if (i < p) {
data[p] = data[i];
p = i;
}
for (; ! (j <= p || data[j] < pivot); --j);
if (j > p) {
data[p] = data[j];
p = j;
}
}
data[p] = pivot;
if (p - left > 1)
quick_sort (data, left, p - 1);
if (right - p > 1)
quick_sort (data, p + 1, right);
}
/* 测试用例 */
int main (void) {
srand (time (NULL));
int data[10];
size_t i, size = sizeof(data) / sizeof(data[0]);
for (i = 0; i < size; ++i)
printf ("%2d ", data[i] = rand () % 100);
printf ("\n");
quick_sort (data, 0, size - 1);
for (i = 0; i < size; ++i)
printf ("%2d ", data[i]);
printf ("\n");
return 0;
}
相关文章推荐
- C/C++程序员:基本排序算法之插入排序
- 考查C++/C程序员的基本编程技能面试题
- 排序算法,基本的高级语言都有一些提供。C语言有qsort()函数,C++有sort()函数,java语言有Arrays类(不是Array)。用这些排序时,都可以写自己的排序规则。
- C/C++程序员基础:Linux C高级编程基本知识点
- 用于测试C++/C程序员的基本编程技能、编程质量以及对C++/C的理解程度的一份考卷试题
- 用于测试C++/C程序员的基本编程技能、编程质量以及对C++/C的理解程度的一份考卷试题
- C/C++程序员:模版和容器的基本应用
- 排序算法用C++的基本算法实现十个数排序
- 程序员必须掌握的8种排序算法(六):快速排序
- 基本排序算法之3——快速排序quicksort
- 基本排序算法的实现(我的练习 快速排序有三种实现方式,值得关注)
- C++程序员面试函数 排序算法 (四)
- 用于测试C++/C程序员的基本编程技能、编程质量以及对C++/C的理解程度的一份考卷试题
- 程序员必须掌握的六种基本排序算法
- Java程序员.回头学C/C++ 之 Java&C基本数据类型大对比
- c++ 基本的排序算法
- 基本排序算法的实现代码(c++)
- 七大基本排序算法之快速排序
- C++基本排序算法详解
- 用于测试C++/C程序员的基本编程技能、编程质量以及对C++/C的理解程度的一份考卷试题