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. 深度剖析collections模块

    namedtuple OrderedDict deque tuple defaultdict Counter ChainMap

  2. Java微信公众平台开发(一)--接入微信公众平台

    转自:http://www.cuiyongzhi.com/post/38.html (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin ...

  3. Apple Ad Hoc

    Apple Ad Hoc 发布测试 App只能通过Ad Hoc分享给绑定我们账号的设备上,所以至是一百台 1.官网member Center创建Ad Hoc证书 2.在官网下载Ad Hoc证书到mac ...

  4. linux内核中task_struct与thread_info及stack三者的关系

    在linux内核中进程以及线程(多线程也是通过一组轻量级进程实现的)都是通过task_struct结构体来描述的,我们称它为进程描述符.而thread_info则是一个与进程描述符相关的小数据结构,它 ...

  5. Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】

    Charles所有关于hadoop的文章参考自hadoop权威指南第四版预览版 大家可以去safari免费阅读其英文预览版.本人也上传了PDF版本在我的资源中可以免费下载,不需要C币,点击这里下载. ...

  6. pandas读写excel

    import pandas as pd import numpy as np df = pd.read_csv("result.csv") # csv # df = pd.read ...

  7. 移植OK6410&#039;S&nbsp;dm9000ae…

    转载自:http://lagignition.blog.163.com/blog/static/12873002320110443341961/

  8. 01 asp.net编程笔记

    1.asp.net 获取当前网址url 参考地址:http://www.cnblogs.com/190196539/archive/2011/12/13/2286072.html 设当前页完整地址是: ...

  9. Leetcode:Task Scheduler分析和实现

    题目大意:提供k个任务,这些任务没有依赖关系(即可以任意调度).CPU完成一个任务需要耗时一个时间片段,当执行完一个任务后,相同的任务必须在n个时间片段才能得以执行.请问CPU通过调度最快能在多少时间 ...

  10. js,javascript生成 UUID的四种方法

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...