快速排序的核心思想是 分治法。
通俗的说,就是将数组中所有小于 枢轴 的元素放在它的左边,大于它的放在它的右边。(枢轴即中轴,即所有元素与之进行比较的元素)
然后再对其左边和右边的数组元素运用同样的方法进行排序。
快速排序1:
#include "stdafx.h"
#include <iostream>
void swap(int *a, int *b){
int temp;
temp = *b;
*b = *a;
*a = temp;
}
void QuickSeq(int a[],int low,int high){
if (low < high){
int left = low;
int right = high;
int pivot = a[low];//设置枢轴
while (low < high){ //只要左边和右边还没撞上就不停的进行交换,使得小的元素都归在左边一方,较大的元素归于右边一方
while (low < high && a[high] >= pivot){ //从最右边找到小于枢轴的元素
high--;
}
while (low < high && a[low] <= pivot){ //从最左边找到大于枢轴的元素
low++;
}
swap(&a[low], &a[high]);//交换较小的和较大的元素
}
swap(&a[left], &a[low]);//交换枢轴和数组中间的元素,使得数组头的文件在数组中间,小于它的在左边,大于它的在右边
QuickSeq(a, left, low-1);//所有小于中间元素的一边进行同样的操作
QuickSeq(a, low+1, right);//所有右边的元素按照同样的方法也进行排序。
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n;
scanf_s("%d", &n);
int a[100];
for (int i = 0; i < n;i++){//输入要排序的数组
scanf_s("%d", &a[i]);
}
QuickSeq(a,0,n-1);//快速排序
for (int i = 0; i < n; i++){ //输出排好序的数组
printf("%d ", a[i]);
}
system("pause");
return 0;
}
快速排序2:
#include "stdafx.h"
#include <iostream>
void QuickSeq(int a[], int n, int low, int high){
int i, j, t;
if (low < high){
int i = low;
int j = high+1;
while (1){
while (i + 1 < n && a[++i] < a[low]); //往右走,找到大于枢轴的元素
while (j - 1 >-1 && a[--j] > a[low]); //往左走,找到小于枢轴的元素
if (i>=j){
break;//当左边的角码大于右边的角码时,跳出循环。
}
t = a[i], a[i] = a[j], a[j] = t;//交换较大和较小元素
}
t = a[low], a[low] = a[j], a[j] = t;//将枢轴元素放在数组中间处
QuickSeq(a, n,low,j-1 );//对枢轴左边的元素进行快速排序
QuickSeq(a, n,j+1, high);//对枢轴右边的元素进行快速排序
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n;
scanf_s("%d", &n);
int a[100];
for (int i = 0; i < n; i++){
scanf_s("%d", &a[i]);
}
QuickSeq(a, n,0, n - 1);//快速排序
for (int i = 0; i < n; i++){
printf("%d ", a[i]);
}
system("pause");
return 0;
}