快速排序大讲解(数组实现,链表实现,层次分析)
2019-02-16 12:05
92 查看
快速排序大讲解
思想
通过一趟的排序将需要排序的数组分成独立的两个部分,其中一部分都比基准值小,另一部分比基准值大
数组实现
因为数组是连续的存储空间,所以如果要将数组分成两个部分,需要用交换来完成.
void quick_sort(int *num, int l, int r) { if (r <= l) return ; int x = l, y = r, z = num[l]; while (x < y) { while (x < y && num[y] >= z) --y; if (x < y) num[x++] = num[y]; while (x < y && num[x] <= z) ++x; if (x < y) num[y--] = num[x]; } 4000 num[x] = z; quick_sort(num, l, x - 1); quick_sort(num, x + 1, r); return ; }
链表实现
链表是非连续的存储空间,是依靠指针去寻找下一个数组的位置的,所以需要用改变指针的指向来完成.
//没有有虚拟头节点,最后一个节点不参与排序 Node* quick_sort(Node *head, Node *tail){ if(head == NULL) return NULL; //head是尾部,有一个节点,没结点 if(head->next == NULL || head->next == tail || head == tail) return head; Node temp;//虚拟节点 temp.next = head; Node *x = head, *y = tail, *z = head; while(x != y && x->next != NULL){ while(x != y && x->next != NULL && x->next->data >= z->data) x = x->next; if(x != y && x->next != NULL){ Node *inse = x->next; x->next = inse->next; inse->next = temp.next; temp.next = inse; } } //printf(" %d %d ",temp.next->data,z->data); temp.next = quick_sort(temp.next, z); z->next = quick_sort(z->next, NULL); return temp.next; }
快速排序与二查排序树的联系
快速排序的每次处理是找到一个基准值,并且将数据以基准值为边界分为两部分,也可以称为两个集合.
二查排序树是以跟节点为界,根节点的左孩子都小于根,根节点的右孩子都大于根,也是两个集合
如果我们将二查排序树以每层的基准值为根节点将上层的基准值与下层的基准值进行连线,就会形成一个二叉排序树的结构.
相关文章推荐
- python栈的讲解,栈可以用数组和链表存储,但是python中只用list就可以实现了
- 约瑟夫环-链表和数组表示实现及分析(Josephus Problem)
- C++:探究纯虚析构函数以及实现数组的快速排序与链表的归并排序
- mysql内核分析--innodb动态数组内部实现(上) (摘自老杨)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 用数组实现冒泡排序的精细化分析
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 全国二级C语言------易错点整理(套卷分析)~12(链表&&数组)
- 求两个数组的交集、并集和差集算法分析与实现(转自http://blog.sina.com.cn/s/blog_616e189f0100mrdn.html)
- (第7讲)利用双向链表实现双端队列、优先级队列(有序数组实现、有序链表实现)
- 数组排序方法的性能比较(3):LINQ排序实现分析
- 链表翻转的图文讲解(递归与迭代两种实现)
- 用单链表与数组实现队列先进先出的数据结构
- 对字符串进行直接插入排序、堆排序、归并排序、快速排序实现以及性能分析
- 邻接表的两种实现(链表和数组模拟)
- 简单符号表的实现(链表和数组)
- 用数组实现3种类型的线性表(有序链表、无序链表、索引链表)
- 约瑟夫圆环的两种实现,数组模拟和链表模拟
- iOS - OC字典底层实现模拟(数组+链表)
- 一起谈.NET技术,数组排序方法的性能比较(中):Array.Sort<T> 实现分析