快速排序
Posted 程序员小毛驴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。
快速排序是 C.R.A.Hoare 于 1962 年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
一、快速排序
1.1 分治法基本思想
1.先从数列中取出一个数作为基准数(枢轴)。2.分区过程将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。(升序)
3.再对左右区间重复第二步,直到各区间只有一个数。
1.2 代码示例
//因为在左边挖坑,从右面开始 找比基准数小的
while (left < right && arr[right] > target)
right--;
if (left < right)
arr[left] = arr[right];
left++;
控制台: +------------------------------------------------------------------+ 打印快速排序前的数组: 9 0 2 6 1 7 8 4 3 4 第1次比较结果: 4 0 2 6 1 7 8 4 3 +------------------------------------------------------------------+第一次比较完后 变量i(left)=1, j=9,target=9,第二轮比较和第一轮相反,我们从左往右寻找比target大的数 每次i++ 结果没有比target大的。跳出循环且递归自己.经过前面2轮比较已经确任9是最大的,这时候可以不用再比较9这个数,将 j--。
//从左向右找比基准数大的
while (left < right && arr[left] < target)
left++;
//
// 快速排序.cpp
// 数据结构
//
// Created by 刘龙玲
// Copyright © 2016年 liulongling. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//打印数组
void PrintArray1(int* arr, int length)
for (int i = 0; i < length; i++)
printf("%d ", arr[i]);
printf("\\n");
int i = 1;
void QuickSort(int* arr,int low,int height)
int left = low;
int right = height;
//取出基准数
int target = arr[left];
if (left < right)
while (left < right)
//因为在左边挖坑,从右面开始 找比基准数小的
while (left < right && arr[right] > target)
right--;
if (left < right)
arr[left] = arr[right];
left++;
printf("第%d次比较结果:\\n",i++);
PrintArray1(arr, 9);
//从左向右找比基准数大的
while (left < right && arr[left] < target)
left++;
if (left < right)
arr[right] = arr[left];
right--;
printf("第%d次比较结果:\\n",i++);
PrintArray1(arr, 9);
//这个时候 left 和 right 同时指向的位置,将基准数插入这个位置
arr[left] = target;
printf("第%d次比较结果:\\n",i++);
PrintArray1(arr, 9);
QuickSort(arr, low, left - 1);
QuickSort(arr, left + 1, height);
int main(void)
int array[] =9,0,2,6,1,7,8,4,3,4;
int length = sizeof(array) / sizeof(int);
printf("打印快速排序前的数组:\\n");
PrintArray1(array, length);
QuickSort(array,0,length-1);
printf("打印快速排序后的数组:\\n");
PrintArray1(array, length);
return 1;
控制台: +------------------------------------------------------------------+ 打印快速排序前的数组: 9 0 2 6 1 7 8 4 3 4 第1次比较结果: 4 0 2 6 1 7 8 4 3 第2次比较结果: 3 0 2 6 1 7 8 4 3 第3次比较结果: 3 0 2 6 1 7 8 4 6 第4次比较结果: 3 0 2 4 1 7 8 4 6 第5次比较结果: 3 0 2 4 1 7 8 7 6 第6次比较结果: 1 0 2 4 1 4 8 7 6 第7次比较结果: 1 0 2 4 4 4 8 7 6 第8次比较结果: 0 0 2 3 4 4 8 7 6 第9次比较结果: 0 1 2 3 4 4 6 7 6 打印快速排序后的数组: 0 1 2 3 4 4 6 7 8 9 +------------------------------------------------------------------+
以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章