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 ...
随机推荐
- peerconnection_client分析笔记
Windows版本的peerconnection_client demo是一个win32程序,入口函数为main.cc里面的wWinMain,程序整体流程就从这个入口函数下手开始分析. 1.peer ...
- ffmpeg-URL(转)
ffmpeg中为方便对资源进行访问,定义了两个结构体,URLContext中是对具体资源文件进行操作的上下文,URLProtocol则是在将资源进行分类的基础上,对某一类资源操作的函数集,熟悉Linu ...
- struts2结合axis开发webservice
第一步:引入axis的依赖jar包 第二步:修改web.xml文件 <listener> <listener-class>org.apache.axis.transport ...
- aop计算方法耗时
package necs.omms.common.aop; import lombok.extern.apachecommons.CommonsLog;import org.apache.common ...
- cuteFTP软件往linux中上传文件时报…
我是在win7和VM中的ubuntu传输文件: 使用一个客户端,可以正常的连接,但是当上传文件时,总是报553 Could not create file错误信息. 主要原因是新建的文件夹没有更改权限 ...
- ubuntu apt-get用法
如何在ubuntu下面直接查找想要安装的软件?比如我想安装tomcat,但是我又不知道ubuntu里面有哪些版本,也不知道都需要装什么,但是我能确认我装的是tomcat,那么我就可以用搜索命令:例如: ...
- Python之面向过程和面向对象的区别
一.面向过程 1.面向过程:核心是过程二字,过程指的是解决问题的步骤,好比如设计一条流水线,是一种机械式的思维方式. 就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题 .基本设计思路就是 ...
- 【codevs2822】爱在心中
题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度 ...
- 360 安全卫士 for Linux 使用结果
测试了一把,结果显示360基本对Linux社区规范和安全常识不give a fuck. 胡乱打包 首先,这个deb包就是胡乱打包,依赖关系就没弄好: $ dpkg-deb -I 360safeforl ...
- DBMS ODBC JDBC是什么?
昨天躺在被窝里面看了几页电子书,今天写下来. 数据库就是存放数据的仓库. DBMS的意思是数据库管理系统,作用就是“管理”数据库的.“管理”这两个字简单说来就是“增删改查”.所以DBMS就是能够对数据 ...