单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]作为key
for (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");
}