快速排序算法
快速排序的算法,说一下快速排序的思想。从数组中找一个数作为基准(一般就是数组第一个元素)。小于基准的数放到数组前面,大于基准的数放到数组后面。数组变成 小 |基准| 大。然后比基准小的数组成新的数组,继续用这种方法处理排序(基准是新数组的第一个元素)比基准大也是同样处理的。容易想到当基准前只有一个数则比基准小的部分排序完成,同理。当基准后只有一个数则比基准大的部分排序完成。这就是排序完成退出条件
算法大致是这样一个过程,首先我把第一个元素拿出来作为基准了。此时我的数组第一个元素的位置可以说为 “空” 。然后我从数组末尾(用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
浙公网安备 33010602011771号