数据结构——C语言实现快速排序算法

news/2024/5/19 22:17:20 标签: 数据结构, 算法, 快速排序, 排序算法

1.基本思想

       先从数列中选取一个数为基准数;
       把所有大于基准数的数放在基准数的右边,小于基准数的放在左边;
       对上面的数列以上个基准数为轴,分别对左右两个数列再次递归调用函数选择新的基准数继续比较;

2.算法实现

#include<stdio.h>
int quick(int arry[],int left,int right)
{
	int key = arry[left];  //取数组的第一个值作为基准数
	int l = left; //l和r的作用是指针
	int r = right;
	int temp;
	if(l < r)
	{
	while(l != r) //l和r不相遇时
	{
		//先从右边找,直到找到比基准数小的值,指针r停止移动,再从左边找
		while(arry[r] >= key && l < r) 
			r--;
		//从左边开始找时,当指针l所指的值大于基准数时停止移动指针
		while(arry[l] <= key && l < r)
			l++;
		if(l < r)
		{
			temp = arry[l];
			arry[l] = arry[r];
			arry[r] = temp;
		}
	}
	arry[left] = arry[l];
	arry[l] = key;  //当相遇时则执行本句,即将key值与两指针共同所指的值互换位置
	//此时这组数的基准数key以右都是比key大的,以左都是比key小的
	quick(arry,left,l-1);   //递归,将key左边的数继续以最左边的数为基准排序
	quick(arry,l+1,right); //将key右边的数继续以最左边的数为基准排序
	}
	return *arry;
}
int main()
{
	int i;
	int arry[6] = {4,2,6,3,7,5};
	quick(arry,0,5);
	for(i = 0;i < 6;i++)
		printf("%d",arry[i]);
}

3.算法分析

       在本算法中,每次选取的基准数都是数列中最左侧的数,通常选取首元素或最后一个元素作为基准数;
       最优情况是数列分布较为均匀时,这个意思就是在进行第一趟排序后,第一次选取的基准数正好在数列的中心位置,这样就把数列均匀的分布成了两个元素个数相当的数列。若排序的数列为n个,则需要递归lb n次,时间复杂度为O(n lb n)
       最坏情况是,每次所选的基准数为最大或最小的数,这样的话每次经过一趟排序后被划分的两个数列就有一个是空的,另一个数列的长度为原来长度减1,时间复杂度为O(n²)
       平均时间复杂度为O(n lb n)
经过分析我们可以知道,基准数的选取是影响算法性能的关键。


http://www.niftyadmin.cn/n/1426582.html

相关文章

LeetCode125 验证回文串

验证回文串 双指针:left &#xff1a;从前往后遍历字符串 &#xff0c;right从后往前遍历字符串&#xff0c;若发现不是字符则跳过continue&#xff0c;进行比较是否相等 package KTwoPointers;/*** Author Zhou jian* Date 2020 ${month} 2020/5/4 0004 00:51* 给定一个字…

数据结构——C语言实现选择排序算法

1.算法思想 在一组数列中选择最小的放在数列的第一个位置&#xff0c;再从剩下的数列中找最小的放在第二个位置&#xff0c;以此类推&#xff0c;依次找到到最小的数。 在实现的过程中&#xff1a; 我们可以先设第一个元素为最小的数&#xff0c;设一个指针min指…

学习笔记——HTML标签(上)

一个web页面由三个基本部分构成&#xff1a; 结构&#xff1a;对网页元素进行整理、分类&#xff0c;是基本的框架结构&#xff0c;用HTML实现。 表现&#xff1a;是对页面的版式、颜色、大小、样式&#xff0c;用CSS实现。 行为&#xff1a;网页交互&…

LeetCode680 验证回文字符串II

验证回文串>>> 在 上提的基础上&#xff0c;可以删除字符&#xff0c;也就是可以跳过某些字符 package KTwoPointers;import AarrayProblem.Problem1;/*** Author Zhou jian* Date 2020 ${month} 2020/5/4 0004 01:02*/ public class Problem680 {/**** param s* …

LeetCode141 环形链表

环形链表>>> 双指针&#xff1a;快慢指针 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public boolean hasC…

LeetCode167 两数之和输入有序数组

LeetCode167 双指针:首位指针向数组中间进行推进&#xff0c; package KTwoPointers;/*** Author Zhou jian* Date 2020 ${month} 2020/5/5 0005 11:41* 两数之和----输入有序数组* 使用双指针&#xff0c;一个指针指向较小的元素&#xff0c;一个指向值较大的元素&#xf…

LeetCode876 链表的中间节点

链表的中间节点》》》 快慢指针:使用两个指针&#xff0c; public ListNode middleNode(ListNode head) {if(headnull||head.nextnull) return head;ListNode slow head;ListNode quick head;while(quick!null&&quick.next!null){slowslow.next;quickquick.next.nex…

leetCode206 反转链表

反转链表 迭代法&#xff1a;双指针&#xff1b;一个指针指向已经反转链表的尾部&#xff0c;一个指针指向待反转链表的首部&#xff0c;不断遍历即可 public ListNode reverseList(ListNode head) {if(headnull||head.nextnull) return head;//已经反转链表的尾部ListNode pr…