快排之单FOR搞定

单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");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值