快排之单FOR搞定

来源:互联网 发布:9分达人阅读 知乎 编辑:程序博客网 时间:2024/05/16 05:36

单FOR版快排。

平常的快排就不介绍了: 进入正题

单FOR快排的思想和平常的快排一样,将数组的起作为排序的KEY,就是将比KEY小的放到KEY的左边,比KEY大的放到KEY的右边。递归调用

但是比双FOR少了一层循环

用双指针错位的方式来巧妙实现  图解 :  KEY  =  4,i 为起始 ,j为下一个作为初始化。这里J会循环到末尾,当j<i的时候,i++; 这里i++的作用相当于普通快排中的从左边找到第一个KEY大的数,j始终++,作用:找到比KEY小的数

SWAP的时候,就将小的移到了左边,大的移到了右边,图中第一次循环4>2 i++ swap,没有改变 ,

一次循环结束后j = 5 , i不动,J继续++,j=3,3<4成立,交换,i指向的是5,5和3对调

依次类推到J加到末尾的时候,将4放到I所指的位置上就完成了一次快排操作。





上代码 ,根据代码理解吧。 数组版本

#include <stdio.h>void quicksort(int *p,int begin,int end){//单for循环搞定if (begin < end){int i = begin;//p[begin]作为keyfor (int j = i + 1; j <= end;j++){//如果J<KEY 交换 if (p[j] < p[begin]){i++;int temp = p[i];p[i] = p[j];p[j] = temp;}}// 将 KEY放到分好的位置 此时I的位置就是放KEY的位置int temp = p[i];p[i] = p[begin];p[begin] = temp;quicksort(p, begin, i - 1);quicksort(p, i + 1, end);}}int main1(){int s[10] = { 5, 4, 3, 10, 7, 8 };quicksort(s, 0, 6);for (int i = 0; i < 6;i++){printf("%d ", s[i]);}system("pause");return 0;}

链表版本:


#include<stdio.h>typedef struct LinkListNode {int data;struct LinkListNode* next;}Node;void add(Node* phead,int data){//头插法if (phead==NULL){return;}Node* node1 = malloc(sizeof(Node));node1->data = data;node1->next = NULL;Node *pbck = phead;while (pbck->next!=NULL){pbck = pbck->next;}pbck->next = node1;}void listquciksort(Node * phead,  Node *end){if (phead == end){return;}else{int key = phead->data;Node * p1 = phead;for (Node *p2 = phead->next; p2 != end; p2 = p2->next){if (p2->data<key){p1 = p1->next;int temp = p1->data;p1->data = p2->data;p2->data = temp;}}int temp = phead->data;phead->data = p1->data;p1->data = temp;listquciksort(phead, p1);listquciksort(p1->next, end);}}int main(){Node* head = malloc(sizeof(Node));head->data = 10;head->next = NULL;add(head, 11);add(head, 13);add(head, 1);add(head, 5);add(head, 6);Node * pback;pback = head;while (pback->next!=NULL){pback = pback->next;}listquciksort(head,NULL );while (head=head->next){printf("%d ", head->data);}system("pause");}




原创粉丝点击