快速排序算法

        快速排序的算法,说一下快速排序的思想。从数组中找一个数作为基准(一般就是数组第一个元素)。小于基准的数放到数组前面,大于基准的数放到数组后面。数组变成 小 |基准| 大。然后比基准小的数组成新的数组,继续用这种方法处理排序(基准是新数组的第一个元素)比基准大也是同样处理的。容易想到当基准前只有一个数则比基准小的部分排序完成,同理。当基准后只有一个数则比基准大的部分排序完成。这就是排序完成退出条件
        算法大致是这样一个过程,首先我把第一个元素拿出来作为基准了。此时我的数组第一个元素的位置可以说为 “空” 。然后我从数组末尾(用right来表示下标)开始比较。
        1、末尾值比基准小,交换开头(lift)和末尾(right)的元素。这时候末尾是基准。开头是比基准小的数。是不是比基准小的在基准前面吧,对吧
        2、要是末尾比基准大呢,那就数组末尾(right)减一。和倒数第二个比较。直到交换一次或者已经比较到了最开始了(也就是第一个元素(基准)比后面的都小)。如果比较到了最开始了,那没说的,对基准后面的元素继续按着这个流程走,选基准------比较------分出大小。
        说说交换了一次后该怎么做。交换完后。这时候末尾是基准。开头是比基准小的数。然后数组开头(lift)加一,比较数组第开头lift个元素和基准大小。也是两种情况。
        1、lift比基准大。交换开头(lift)和末尾(right)的元素。这时候的开头(lift)是基准。末尾(right)是比基准大的数。是不是比基准大的在基准后面吧,对吧
        2、lift比基准小。lift加一然后继续比较。直到交换了一次或者发现比较完了(lift==right)开头等于末尾了。如果开头等于末尾了。那就完成了完成一次大小分堆了。如果是交换 一次。那么这时候的开头(lift)是基准。末尾(right)是比基准大的数。right减一,继续比较。直到(lift=right)就代表以这个基准的大小分堆完成。
        可能讲的不太好懂,举个例子 ,a={15,7,4,11,3,6} 选15为基准,lift=0 right=5(这两个都是下标)从末尾right开始找,6比15 小,交换。变成a={6,7,4,11,3,15} 。lift加一,7不比15 大。lift继续加一,加到right=4的时候,3还是不比15 大。lift继续加一,right=5=lift,好的,这次的以15 为基准的大小分堆完成。继续对基准前后的元素进行排序。发现基准后面没有,就不用排了。
        对{6,7,4,11,3}处理,选6作为基准, lift=0 right=4,也是从末尾right开始找,3比6小,交换,变成{3,7,4,11,6},left加一,7比6大,交换,变成{3,6,4,11,7},right减一。11比6大,right继续减一,4比6 小,交换。变成{3,4,6,11,7},lift加一,此时lift=right=2。这次的以6 为基准的大小分堆完成。继续对基准前后的元素进行排序。直到发现基准前面只有一个数,则整个排序完成

#include<iostream>

using std::endl;
using std::cin;
using std::cout;

//快速排序
void quick_sort(int nums[], int _left, int _right) {
	int left = _left;
	int right = _right;
	int temp = 0;
	if (left < right) {                                      //如果排序的元素至少有两个则开始排序,只有一个?直接返回了
		temp = nums[left];                                    //待排序的第一个元素作为基准元素
		while (left != right) {                               //从左右两边交替扫描,直到left = right
			while (right > left && nums[right] >= temp) {
				right--;                                      //从右往左扫描,找到第一个比基准元素小的元素
			}			
			nums[left] = nums[right];                         //找到这种元素nums[right]后与nums[left]交换
			while (left < right && nums[left] <= temp) {
				left++;                                       //从左往右扫描,找到第一个比基准元素大的元素
			}
			nums[right] = nums[left];                         //找到这种元素nums[left]后,与nums[right]交换		
		}
		nums[right] = temp;                                   //基准元素归位
		cout << "------------------------------" << endl;
		for (int ix = _left; ix <= _right; ix++) {
			cout << nums[ix] << endl;
		}
		quick_sort(nums, _left, left - 1);                     //对基准元素左边的元素进行递归排序
		quick_sort(nums, right + 1, _right);                   //对基准元素右边的进行递归排序
	}
}
int main()
{
	int num[8]={ 125, 21, 4, 58, 7, 42, 67, 19 };
	int len= sizeof(num) / sizeof(num[0]);
	quick_sort(num, 0,len-1);
	cout << "------------------------------" << endl;
	for (int ix = 0; ix < len; ix++) {
		cout << num[ix] << endl;
	}
	return 0;
}

选择排序 :https://blog.csdn.net/qq_43657442/article/details/103716989

插入排序 :https://blog.csdn.net/qq_43657442/article/details/103717359

冒泡排序 :https://blog.csdn.net/qq_43657442/article/details/103716226

posted on 2021-06-11 09:06  雾恋过往  阅读(84)  评论(0)    收藏  举报

Live2D