1. 数组快排:

 方法一:

#include <stdio.h>
#include <stdlib.h> //交换
void swap(int *pi, int *pj)
{
int temp = *pi;
*pi = *pj;
*pj = temp;
} //显示数组
void show(int *p, int n)
{
printf("\n此时数组为:");
for (int i = ; i < n; i++)
{
printf("%4d", p[i]);
}
} //快排(双冒泡)
//方法一:
void quickSort(int *arr, int iLeft, int iRight)
{
int i = iLeft; //从左边开始循环
int j = iRight + ; //从右边开始循环(为什么+1呢?)为了让i<j则成立,i>=j就终止 if (i < j)
{ do
{
do
{
i++; } while (arr[i] <= arr[iLeft] && i <= iRight);
//最左边第一个大于它的数 do
{
j--; } while (arr[j] >= arr[iLeft] && j > iLeft);//这里不能为j >= iLeft,因为取最左边为边界
//最右边第一个小于它的数 if (i < j)
{
swap(&arr[i], &arr[j]); //交换
} printf("\n枢轴为:(%d)", arr[iLeft]);
show(arr, ); } while (i<j); swap(&arr[iLeft], &arr[j]);
show(arr, );
printf("\n\n---------------------------------------------------"); quickSort(arr, iLeft, j - ); //分割左边
quickSort(arr, j + , iRight); //分割右边
}
} void main()
{
int num[] = { ,,,,,,,,, };
printf("\n排序前:");
show(num, );
printf("\n\n"); quickSort(num, , - ); printf("\n排序后:");
show(num, ); system("pause");
}

  运行结果如下:

方法二:双指针错开

#include <stdio.h>
#include <stdlib.h> //交换
void swap(int *pi, int *pj)
{
int temp = *pi;
*pi = *pj;
*pj = temp;
} //显示数组
void show(int *p, int n)
{
printf("\n此时数组为:");
for (int i = ; i < n; i++)
{
printf("%4d", p[i]);
}
} //方法二:适用于链表的快排
int partition(int *arr, int iLeft, int iRight) //将数组进行分割
{
if (iLeft == iRight)
return ; int key = arr[iLeft];
int i = iLeft;
int j = iLeft + ; while (j < (iRight + ))
{
if (arr[j] < key)
{
++i;
swap(&arr[i], &arr[j]);
}
++j; printf("\n枢轴为:(%d)", arr[iLeft]);
show(arr, );
} swap(&arr[i], &arr[iLeft]);
show(arr, );
printf("\n\n---------------------------------------------------"); return i;
} void QuickSort(int *arr, int iLeft, int iRight)
{
if (iLeft < iRight)
{
int split = partition(arr, iLeft, iRight); QuickSort(arr, iLeft, split); //分割左边
QuickSort(arr, split + , iRight); //分割右边
}
} void main()
{
int num[] = { ,,,,,,,,, };
printf("\n排序前:");
show(num, );
printf("\n\n"); QuickSort(num, , - ); printf("\n排序后:");
show(num, ); system("pause");
}

  运行结果如下:

2. 链表快排:

Node *fen(Node *pbegin, Node *pback)
{
int key = pbegin->data; //以第一个数据为分段 Node *p = pbegin; //第一个节点
Node *q = pbegin->pNext; //第二个节点 while (q != pback)
{
if (q->data < key)
{
p = p->pNext; //循环下一个节点 int temp = p->data; //交换
p->data = q->data;
q->data = temp;
}
q = q->pNext; //循环第二个指针 printf("\n枢轴为:(%d)", key);
printf("\n此时数:");
ShowAll(pbegin); } int temp = p->data; //交换
p->data = pbegin->data;
pbegin->data = temp; printf("\n\n交换值:");
ShowAll(pbegin);
printf("\n-----------------------------------------------"); return p;
} //快速排序法:(双冒泡)
void quickSort(Node *pbegin,Node *pback)
{
if (pbegin != pback)
{
Node *pfen = fen(pbegin, pback); //取中间点,分成两段分别再进行快排 quickSort(pbegin, pfen); //前半段快排
quickSort(pfen->pNext, pback); //后半段快排
}
}

C语言实现数组及链表的快速排序的更多相关文章

  1. PHP内核探索:数组与链表

    在C语言中,我们可以自定义各种各样的数据结构,用来把很多数据保存在一个变量里面,但是每种数据结构都有自己的优缺点,PHP内核规模如此庞大,是否已经找到了一些非常棒的解决方法呢? 我们在选择各种数据结构 ...

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

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

  3. C语言实现数据机构链表的基本操作(从键盘输入生成链表、读取数组生成链表)

    利用头插法实现逆置 下面简单介绍一下,算法思想结合图示看 算法思想:"删除"头结点与链表其他结点的原有联系(即将头结点的指针置空),再逐个插入逆置链表的表头(即"头插&q ...

  4. 【算法】C语言实现数组的动态分配

    C语言实现数组的动态分配 作者:白宁超 2016年10月27日20:13:13 摘要:数据结构和算法对于编程的意义不言而喻,具有指导意义的.无论从事算法优化方向研究,还是大数据处理,亦或者网站开发AP ...

  5. 数组和链表--Java学习笔记(一)

    版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 我是一个全职妈妈,两年前在上海一家人力资源 ...

  6. C语言一维数组、二维数组、结构体的初始化

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  7. 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域

    [源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...

  8. 线性表之顺序存储结构(C语言动态数组实现)

    线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...

  9. Java实现单链表的快速排序和归并排序

    本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...

随机推荐

  1. Windows + Ubuntu 双系统安装

    前言:本篇文章是对之前文章的更新,更新的主内容是把原来用手机拍摄的图片换成了虚拟机的截图,以及对磁盘划分的新的见解和一些使用感受,原本是打算删除之前的那篇Win + Ubuntu双系统的文章的,后来想 ...

  2. Spring AOP 中pointcut expression表达式解析及配置

    Pointcut是指那些方法需要被执行”AOP”,是由”Pointcut Expression”来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. ...

  3. 2017年排名前15的数据科学python库

    2017年排名前15的数据科学python库 2017-05-22 Python程序员 Python程序员 Python程序员 微信号 pythonbuluo 功能介绍 最专业的Python社区,有每 ...

  4. Java微信公众平台开发(二)--微信服务器post消息体的接收

    转自: http://www.cuiyongzhi.com/post/39.html 在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发 ...

  5. js判断页面加载完毕方法

    判断页面加载完成这个方法是很常见的,下面有三个常用的方法,各有利弊. 一.纯js方法 // (1).页面所有内容加载完成执行 window.onload = function(){ } // (2). ...

  6. jQuery.prop() 与attr()

    1.attr()是jQuery 1.0版本就有的函数,prop()是jQuery 1.6版本新增的函数.毫无疑问,在1.6之前,你只能使用attr()函数:1.6及以后版本,你可以根据实际需要选择对应 ...

  7. 关于项目报错Dynamic Web Module 3.0 requires Java 1.6 or newer 的解决方法

    起因:今天使用maven创建web项目的时候发现项目上老是有个红X,错误如下图所示,虽然项目能正常运行起来,但是LZ的强迫症发作,不弄掉就觉得心里不舒服,于是上网查了攻略,几经周折最终大功告成,现在就 ...

  8. 为什么学习python?(知乎大神的回答)

    学习PHP 是因为得到一份工作 学习Java 是因为他们选修了计算机科学这门课程 学习python 是因为爱这门语言,因为寻求美

  9. Centos7.2 下搭建LNMP环境(终极版)Yum安装

    PHP7.1+Nginx+MySQL5.7 安装PHP //安装源只要遇到选择的全是Y rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-rele ...

  10. PHP数组在循环的时候修改本身的值

    这样的修改并不是修改本身,$item就相当于赋值了一份数组中的值,就跟JAVA中的值方式传递值类型一样,我只是拿了你的值,并不是拿了你的内存地址,所已$item的改变,并不会影响数组 第一种方式就是直 ...