快速排序笔记

#快速排序笔记
核心思想
一般以区间的最左边值或最右边值作为基准值
在区间内,此处以最右边的值为基准值。
设除了基准值的最左值为左哨兵、最右值为右哨兵。
左哨兵从左往右扫描,右哨兵从右往左扫描​。
(1)左哨兵先扫描,当左哨兵发现比基准值大的时候停下;(2)当右哨兵发现比基准值小时停下​;(3)当左右哨兵停下时交换两者的值,然后继续;(4)如果左哨兵遇到右哨兵则基准值的位置已确定,将右哨兵位置与基准值交换。
这样,比基准值大的都在基准值右边,比它小的都在左边,然后用递归将所有数值排序​。
(如果以最左值为基准值,就右哨兵先扫描)
代码如下:

#include<stdio.h>
int main()
{
	void quickSort(int a[],int left,int right);
	int a[8]={43,52,10,39,91,100,43,67};
	int i;
	quickSort(a,0,7);
	for(i=0;i<8;i++)
	{
		printf("%4d",a[i]);
	}
	return 0;
} 
void quickSort(int a[],int left,int right)
{
	int i,j,temp;
	i=left;
	j=right;
	temp=a[left];//此处用最左为基准值 
	if(left>=right)
	return;
	while(i!=j)
	{
		while(a[j]>=temp&&j>i)
		j--;//当右边的小于temp时停 
		while(a[j]<temp&&j>i)
		{
			a[i++]=a[j];
			a[j]=temp;
			while(a[i]<=temp&&j>i)
			i++;//左边的>temp停 
			while(a[i]>temp&&j>i)
			{
				a[j--]=a[i];
				a[i]=temp;
			}
		}
	}
	quickSort(a,left,i-1);//ok后的递归左边
	quickSort(a,i+1,right);//ok后的递归右边 
}
/*
最左边标记为L
最右标记为R
basic基准值 
R当左移动,当R小于basic停止移动
L向右移动,当L大于basic停止移动 
当都停止时,交换L和R的值
继续相同的步骤
当L=R时,两标记停止移动
将该数字与basic交换
从而收集左边小于basic的集合,右边收集大于basic的集合。 
然后通过递归进行排序 
*/
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供关于数据结构内排序笔记。 内排序是指在排序过程中,所有待排序的数据元素全部存放在内存中进行排序。常见的内排序算法有冒泡排序、插入排序、选择排序快速排序、归并排序等。 1. 冒泡排序 冒泡排序是一种交换排序。它的基本思想是:通过交换相邻两个元素的位置,把大的元素往后面移动,小的元素往前面移动,从而实现排序的目的。 代码实现: ```c void bubble_sort(int arr[], int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j+1]) { swap(arr[j], arr[j+1]); } } } } ``` 2. 插入排序 插入排序是一种插入排序。它的基本思想是:将待排序的元素插入到已经排好序的序列中,从而得到一个新的、更大的有序序列。 代码实现: ```c void insertion_sort(int arr[], int len) { int i, j, tmp; for (i = 1; i < len; i++) { tmp = arr[i]; for (j = i; j > 0 && arr[j-1] > tmp; j--) { arr[j] = arr[j-1]; } arr[j] = tmp; } } ``` 3. 选择排序 选择排序是一种选择排序。它的基本思想是:每次从待排序的序列中选择一个最小的元素,放到已经排好序的序列的末尾,直到所有元素都排好序。 代码实现: ```c void selection_sort(int arr[], int len) { int i, j, min_idx; for (i = 0; i < len - 1; i++) { min_idx = i; for (j = i + 1; j < len; j++) { if (arr[j] < arr[min_idx]) { min_idx = j; } } swap(arr[i], arr[min_idx]); } } ``` 4. 快速排序 快速排序是一种分治排序。它的基本思想是:通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比另一部分的元素小,然后再对这两部分分别进行排序,直到整个序列排好序为止。 代码实现: ```c void quick_sort(int arr[], int l, int r) { if (l < r) { int i = l, j = r, x = arr[l]; while (i < j) { while (i < j && arr[j] >= x) j--; if (i < j) arr[i++] = arr[j]; while (i < j && arr[i] < x) i++; if (i < j) arr[j--] = arr[i]; } arr[i] = x; quick_sort(arr, l, i-1); quick_sort(arr, i+1, r); } } ``` 5. 归并排序 归并排序是一种分治排序。它的基本思想是:将待排序序列分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序序列。 代码实现: ```c void merge(int arr[], int l, int m, int r) { int i, j, k; int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1 + j]; i = 0; j = 0; k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k++] = L[i++]; } else { arr[k++] = R[j++]; } } while (i < n1) { arr[k++] = L[i++]; } while (j < n2) { arr[k++] = R[j++]; } } void merge_sort(int arr[], int l, int r) { if (l < r) { int m = (l + r) / 2; merge_sort(arr, l, m); merge_sort(arr, m+1, r); merge(arr, l, m, r); } } ``` 以上是内排序的几种常见算法。需要注意的是,不同的算法在不同的数据情况下,其效率也会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值