看了这本《数据结构与算法分析》中的快速排序。

写下自己理解后的代码,以备后用。

#include "stdio.h"

void insertSort(int arr[], int N)
{
int j, tmp, P;
for(P=; P< N; P++)
{
tmp = arr[P];
for(j=P; j> && arr[j-] > tmp; j-- )
arr[j] = arr[j-];
arr[j] = tmp;
}
} void swap(int *first, int *second)
{
int tmp = *first;
*first = *second;
*second = tmp;
} void printArr(int arr[], int N)
{
int i;
for( i = ; i < N; i++)
{
printf("%d\t", arr[i]);
}
printf("\n");
} int median3(int arr[], int left, int right)
{
int mid = (left + right)/;
if(arr[left] > arr[mid])
swap(&arr[left], &arr[mid]);
if(arr[left] > arr[right])
swap(&arr[left], &arr[right]);
if(arr[mid] > arr[right])
swap(&arr[mid], &arr[right]); swap(&arr[mid], &arr[right-]);
return arr[right -];
} void quickSort(int arr[], int left, int right)
{
int coutoff = ;
if(left + coutoff < right)
{
int pivort = median3(arr, left, right);
int i = left, j = right - ;
for(;;)
{
while(arr[++i] < pivort) {}
while(arr[--j] > pivort) {}
if(i < j)
swap(&arr[i], &arr[j]);
else
break;
}
swap(&arr[i], &arr[right -]);
quickSort(arr, left, i - );
quickSort(arr, i + , right);
}
else
{
insertSort(arr + left, right -left + );
}
} int main()
{
int test[] = {, , , , , , , , , };
printArr(test, );
quickSort(test, , );
// insertSort(test, 10)
printArr(test, );
return ;
}
 
主要步骤:
1,首先要写好swap,写好插入排序。
2,然后写好选择哨兵(中间值)的代码 median3,并且要记得隐藏哨兵节点(交换 mid 和 right - 1),这样left, right -1 , right 就是已经排序的了, 这样第一个节点和最后一个节点就不用进行检查了。
3,左侧检查实际上从left + 1 开始,右侧检查实际上从right-2开始。当然为了++i, --j 方便, 并且查到要交换的位置就是i,j的值,设置了初值为左:left,右:right-1。
4,循环找左侧比哨兵大的值,右侧找并哨兵小的值,如果有则交换,如果循环到最后相遇了那么就表示没有可以交换的了,i 和 j 都走到合适的位置。此时i 的位置就是比哨兵大的第一个位置, j 的位置就是比哨兵小的第一个位置。
5, 一次排序结束后当然记得将哨兵放回去, 交换 i 和 right-1。
6,然后再从节点位置分成两部分排序。[left ~ i-1] 和[ i+1 ~ right]。
 
当元素小于三个的时候直接用插入排序。
注意问题:插入排序参数是数组长度,而快速排序的参数是左侧索引和右侧索引。
 
如果理解有错误,大家多指正。

快速排序 - C语言的更多相关文章

  1. 快速排序_C语言_数组

    快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...

  2. [数据结构] 快速排序C语言程序

    //由大到小//快速排序(待排序数组,左侧起点,右侧起点) void quickSort(int *array, int l, int r) { if ( l >= r) return; int ...

  3. 快速排序 C语言实现

    转载于> http://blog.chinaunix.net/uid-26404477-id-3329885.html 总的关键字比较次数:O(nlgn) 尽管快速排序的最坏时间为O(n2),但 ...

  4. 快速排序c语言实现

    #include <stdio.h> void quick_sort(int* a, int n) { ) return; int i,j,tmp,k; k = a[n/]; ,j = n ...

  5. P1177【模板】快速排序(JAVA语言)

    import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util ...

  6. 快速排序C语言版图文详解

    ​ 算法原理:选一个数位基准,将序列分成两个部分,一边全是比它小序列,另一边全是比它大序列.然后再分别对比他小的序列和比再次进行基准分割.依次分割下去,得到一个有序的队列. 原理图示: ​编辑 ​编辑 ...

  7. C语言排序

    排序算法 快速排序 C语言快速排序qsort(数组,长度,元素大小,cmp函数(*,*))//注意函数cmp的参数为指针 #include <stdio.h> #include <s ...

  8. PHP-----数组和常见排序算法

    数组的创建 <?php //php创建数组 //第一种方法 $arr[0]=1; $arr[1]=23; $arr[2]=20; $arr[3]=43; for($i=0;$i<count ...

  9. Neo4j 3.5发布,在索引方面大幅增强

    Neo4j 3.5版本已正式发布,这也是Neo4j宣布企业版闭源以来发布的第一个版本. 这个版本在性能.资源使用率以及安全方面均有增强,我们可以先快速浏览一下这个版本: 全文索引 基于Index的快速 ...

随机推荐

  1. Postgresql-xl 调研

    Postgresql-xl 调研 来历 这个项目的背后是一家叫做stormDB的公司.整个代买基于postgres-xc.开源版本应该是stormdb的一个分支. In 2010, NTT's Ope ...

  2. Spring概念

    1.控制反转IOC:即生成对象,相当于new的功能,用IOC有利于维护. 2.依赖注入DI:即给属性赋值,相当于JavaBean的setter方法. 3.面向切面方程AOP:使得各个切面和目标类完全松 ...

  3. 在Ubuntu上安装Mysql For Python

    安装: 首先安装pip,并且把pip更新到最小版本 apt-get install python-pip pip install -U pip 安装mysql开发包 apt-get install p ...

  4. AJAX实现跨域的三种种方法(代理,JSONP,XHR2)

    由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问. 比如说你的网站域名是aaa.com,想要通过AJAX请 ...

  5. How-to: Enable User Authentication and Authorization in Apache HBase

    With the default Apache HBase configuration, everyone is allowed to read from and write to all table ...

  6. nodejs安装心得

    首先下载nodejs,http://nodejs.org/download/ 配置系统环境变量 管理员运行cmd, 输入命令 node -v 查看版本 安装npm Npm安装命令 npm-1.3.15 ...

  7. convert return char from sql server 2008 r2 or below version to c#

    C# string.Replace((char)13, ' ') //newline char; string.Replace((char)10, ' ') //return char;

  8. [整理]FPGA学习资料汇总

    01.特权同学倾情奉献海量FPGA学习资料 http://pan.baidu.com/s/1pJIb32F

  9. Gvim插件管理Vundle

    之前关于gvim的博客中提到的很多插件安装比较繁琐,这一篇来介绍一下gvim管理插件的插件--vundle的安装以及使用,让givm的插件安装更加的简单 首先给出vundle的git地址 https: ...

  10. html5 绘制图片 drawImage

    要在绘图上下文中绘制图片,可以使用 drawImage 方法.该方法有三种不同的参数: drawImage(image,dx,dy) drawImage(image,dx,dy,dw,dh) d ...