快速排序算法
下文中提到的“指针”并不是C语言语法上的指针!
下文中提到的“指针”并不是C语言语法上的指针!
下文中提到的“指针”并不是C语言语法上的指针!
首先看下面这个例子:
我们取第一个元素为基准元素:
之后,从右边开始与基准元素挨个比较,如果比基准元素大,右指针往左移,如果比基准元素小,就与左指针指的元素交换(因为左指针永远停留在一个
空白的值上,不用担心值被覆盖)
4的值比5小,所以左右指针的值交换,右指针就变成空的了:
一旦完成交换操作,另一个指针就要开始移动了!
(交换完成后,左指针要立刻右移一下,因为接下来判断左指针是否右移的条件是元素与基准的比较,交换完成后左指针指向的元素交换前已经比较过了)
左指针开始右移,指向的元素与基准元素比较,比基准小左指针继续右移,比基准元素大,就与右指针交换
4比5小,左指针右移:
9比5大,与右指针交换:
一旦完成交换操作,另一个指针就要开始移动了!
(交换完成后,右指针要立刻左移一下,因为接下来判断右指针是否左移的条件是元素与基准的比较,交换完成后右指针指向的元素交换前已经比较过了)
右指针开始左移,第一个元素小于基准
左右指针的值交换:
交换完成左指针应该立刻右移一位:
左指针开始右移
第一个元素0,小于基准,继续右移
下一个元素4也小于基准,继续右移
来到元素7,大于基准,指针的值交换:
交换完成后,右指针立刻左移一位:
元素8大于基准,所以右指针继续左移:
元素4小于基准,交换值:
交换完成,左指针立刻右移一下:
此时左右指针重合,重合位置放入基准元素:
让后基准元素左面都比他小,右面都比他大,左右两个子列再套用上述方法,直至排序结束!
通过分析上面的例子,我们知道,快速排序大体分这么几步:
while(左指针在右指针的左边)
{
while(右指针指向的元素大于基准)
{
右指针右移
}
//退出了上面这个循环说右指针移动到了一个小于基准的元素下面
将右指针指向的值赋值给左指针指向的值
左指针立刻右移一下
while(左指针指向的元素小于基准元素)
{
左指针右移一位
}
//退出了上面这个循环说明左指针移动到了一个大于基准的元素下面
将左指针指向的值赋值给右指针指向的值
右指针立刻左移一下
}
最后左右指针会重合,重合的位置赋值为基准元素的值;
左子列重复快速排序;
右子列重复快速排序;
运行结果:
源码如下:
#include<stdio.h> typedef int keytype; //快速排序 void quicksort(keytype k[] , int ArrayLeft , int ArrayRight) { int left = ArrayLeft; int right = ArrayRight; int temp = k[left]; if (left < right) { while (left < right) { while (left < right && k[right] >= temp) { right--; } //if (k[right] < temp) { k[left] = k[right]; left++; } while(left < right && k[left] <= temp) { left++; } //if (k[left] > temp) { k[right] = k[left]; right--; } } k[left] = temp; quicksort(k,ArrayLeft,left-1); quicksort(k,right+1,ArrayRight); } } #define MAX 100 int main() { //读取一串数字 printf("请输入一串无序数字:"); int c; int n = 1; keytype k[MAX]; while ((c = getchar())!=' ') { k[n++] = c-'0'; } if (c == ' ') { k[n] = ' '; } //快速排序 quicksort(k,1,n-1); printf("这串数字从小到大为:"); for (size_t i = 1; i <= n-1; i++) { printf("%d",k[i]); } return 0; }