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

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

#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. python 数据处理中各种存储方式里数据类型的转换

    自己记录,仅供参考 在数据处理时经常会遇到数据类型不匹配的事情,为了方便查看各种存储方式中数据类型的改变.我把一些自己常用的整理方式记录下来,希望可以为以后数据类型的处理工作提供便利. 数据常用的基本 ...

  2. RunTime的简单使用

    Runtime也就是运行时,是苹果官方提供的一套C语音库,那有什么作用呢?简单的来说,Runtime可以做很多的底层操作,比如说访问隐藏的一些成员变量,成员方法,当然包括了私有的成员变量,成员方法. ...

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

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

  4. andriod前端传来经度 纬度 坐标 来查询数据库坐标周围500M内的类数据

    @Transient public static List<Article> queryByPosition(PositionInfo pinfo){ //System.out.print ...

  5. JavaEE第一天知识点总结

    JavaEE第一天知识点总结 持久化是将程序中的数据在瞬时状态和持久状态间转换的机制 DAO: 英文全称: Date Access Object(数据存取对象) 位于业务逻辑和持久化数据之间 实现对持 ...

  6. 【转载】[C#]Log4net中的RollingFileAppender解析

    Log4日志组件的应用确实简单实用,在比较了企业库和Log4的日志功能后,个人觉得Log4的功能更加强大点.补充说明下,我使用的企业库是2.0版本,Log4net是1.2.1版本的. 在Log4net ...

  7. 转:永久解决火狐浏览器出现的flash版本更新问题

    发现问题: 1.找到火狐浏览器,并打开出现问题的页面. 2.点击火狐浏览器的"打开菜单"按钮,选择"附加组件"按钮. 3.在"搜索所有添加附件&quo ...

  8. python学习心得第二章

    python基础 1.关于python编码的问题. python的编码现在主要是两种版本python2.7和python3.5 python2.7默认的是ascii码进行编译,我们可以采用 # -*- ...

  9. poj1068

    Parencodings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18785   Accepted: 11320 De ...

  10. php面向对象之final的应用

    final从英文字面上很容易理解,翻译成中文就是“最终的”之意.在php面向对象编程中,final的应用主要有两个作用:   1.使用final修饰的类,该不能被继承   01 <?php 02 ...