C语言实现数组及链表的快速排序
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语言实现数组及链表的快速排序的更多相关文章
- PHP内核探索:数组与链表
在C语言中,我们可以自定义各种各样的数据结构,用来把很多数据保存在一个变量里面,但是每种数据结构都有自己的优缺点,PHP内核规模如此庞大,是否已经找到了一些非常棒的解决方法呢? 我们在选择各种数据结构 ...
- 快速排序_C语言_数组
快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...
- C语言实现数据机构链表的基本操作(从键盘输入生成链表、读取数组生成链表)
利用头插法实现逆置 下面简单介绍一下,算法思想结合图示看 算法思想:"删除"头结点与链表其他结点的原有联系(即将头结点的指针置空),再逐个插入逆置链表的表头(即"头插&q ...
- 【算法】C语言实现数组的动态分配
C语言实现数组的动态分配 作者:白宁超 2016年10月27日20:13:13 摘要:数据结构和算法对于编程的意义不言而喻,具有指导意义的.无论从事算法优化方向研究,还是大数据处理,亦或者网站开发AP ...
- 数组和链表--Java学习笔记(一)
版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 我是一个全职妈妈,两年前在上海一家人力资源 ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域
[源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...
- 线性表之顺序存储结构(C语言动态数组实现)
线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链 ...
- Java实现单链表的快速排序和归并排序
本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...
随机推荐
- 使用jq.lazyload.js,解决设置loading图片的问题
最近在使用lazyload的时候,遇上一个问题.当对img做宽100%时,就是placeholder的loading图片也会100%宽,这样一般来说loading图片就会变得很大.实在是不能应用到项目 ...
- 解决"Windows 安装程序不允许从远程桌面连接安装"
msiexec /i c:\路径\安装程序 例如 msiexec /i c:\TortoiseSVN-1.7.2.22327-x64-svn-1.7.2.msi
- 【HDU6026】Deleting Edges
题意 有一个n个节点的无向图,结点编号从0-n-1,每条边的长度时1to9的一个正整数.现在要删除一些边(或者不删),使得到的新图满足下面两个要求. 1.新图是一颗树有n-1条边2.对于每个结点v(0 ...
- mfs实际操作教程
9. 实际操作案例 9.1 默认的垃圾回收时间是86400,存在一种可能性是垃圾还没回收完,你的存储容量就暴掉了.(案例提供者shinelian) 方案1:设置垃圾回收时间,积极监控存储容量. ...
- cocos2D-x demo 的源码分析 #define ..##.. 的妙用.
最近在看cocos2d-x 但不知道如何下手,于是先看一下他编译的完成的testcpp的源码.发现了下面一段程序 typedef CCLayer* (*NEWTESTFUNC)(); #define ...
- mongo状态查看方法
列举一些常用的mongodb状态查看方法. 1.mongostat 是mongdb自带的状态检测工具, inserts/s 每秒插入次数 query/s 每秒查询次数 update/s 每秒更新次数 ...
- 9-python 的ProxyHandler处理器(代理设置)
ProxyHandler处理器(代理设置) 使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的. 很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正 ...
- 解决在Python中使用Win32api报错的问题,No module named win32api
一.系统环境 操作系统: Win7 64位 Python:3.7.0 二.在使用import win32api时,报错:No module named win32api 网上查到有下面解决办法: 方法 ...
- Luogu 1099 树网的核
bzoj1999 数据加强版(n <= 5e5) 较早的noip题,值得研究 重要结论:直径的最长性,任何从直径中离开直径的点到它离开的点的距离,都不会比直径的另一端到它离开的点长(否则就有新的 ...
- 专题2-通过按键玩中断\2440按键中断编程lesson2
1.程序优化 修改Makefile 把main.c里面的mmu代码复制到mmu.c并修改如下 main.c的修改 由于在bootloader当中一般不会使用MMU,所以 main.c 加入led.c文 ...