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 ...
随机推荐
- 「小程序JAVA实战」 小程序的事件(11)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-11/ 我们以前在web开发的时候,web页面也有一些相关的事件,当然小程序要接触屏幕要进行一些点击 ...
- JS中日期处理
- AC自动机详解
概述 AC自动机全称Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法. 考虑这样一个场景,给出L个模式字符串(加总长度为N),以及长度为M大文本, ...
- ASP.NET MVC 和 WebForm的权限控制
今天主要讲一下对于ASP.NET的页面级权限控制 数据结构:用户表.角色表.权限表.角色权限派生表 为用户添加权限的数据配置后, 自定义类对MVC继承Controller 对其内置方法Initiali ...
- Python_14-绘图
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- A Recipe for Training Neural Networks [中文翻译, part 1]
最近拜读大神Karpathy的经验之谈 A Recipe for Training Neural Networks https://karpathy.github.io/2019/04/25/rec ...
- 类型或命名空间名称“Interop”在类或命名空间“Microsoft.Office”中不存在(是否缺少程序集引用?)
准备用C#编写Web程序,生成Excel报表,在使用下面语句时报错. using Microsoft.Office.Interop.Excel; 报错信息:类型或命名空间名称“Interop”在类或命 ...
- 41、Aspera下载安装运用
参考:http://www.so.com/linkm=aLVHG%2FgJT4HyuVeK4%2BxX2LMFvF6oTiTCaruHE20pwjRia7DmVI2hIVfmw%2BFNPczCtvX ...
- Part6-点亮指路灯_lesson1
1. 2.GPIO 查阅芯片手册:GPIO 代码: 3.外设基地址初始化 打开arm核手册, 基地址为0x70000000,去搜芯片手册6410, 把这个基地址告诉处理器,通过协处理器的cp15, 转 ...
- 实践作业3:白盒测试---细化明确任务DAY5
收到老师给我写的评论,感觉老师真的太认真,每个博客都有仔细的,参考了老师发给我的博客,我才明白老师想要的博客内容原来是具体实际的进展记录.我们组其实这些东西早就确定了,会议也开了,但是我之前不明白博客 ...