C语言 快速排序

简介: 本文目录1. 简介2. 代码

1. 简介

快速排序,用分治法提高了效率,简直就是“方法得当,效率提高”的典范之作。


基本思路就是每次都把当前数据化为两部分,每次排序保证前面部分都小于后面部分,然后在对两部分分别快速排序。


那么怎么划分两部分呢,以从小到大排序为例,第一个数为基准,然后从尾到头找小于基准的数,从头到尾找大于基准的数,找到就换位。


则首尾相遇时,必然相遇点左侧的都小等于基准,右侧的都大于等于基准,然后把基准放到中间合适位置,则实现了右边全部大于左边。


2. 代码

#include<stdio.h>
//打印数组
void printArray(int *p, int length)
{
  printf("打印数组:");
  int i;
  for (i = 0; i<length; i++)
  {
    printf("%d ", p[i]);
  }
  printf("\n");
}
//交换
void swap(int* a, int* b) 
{
  int temp = *b;
  *b = *a;
  *a = temp;
}
//快速排序
void fastSort(int* p, int start, int end)
{
  if (start < end)//只要没碰到,就继续排序
  {
    int mid = findMid(p, start, end);
    fastSort(p, start, mid - 1);//对左侧快速排序
    fastSort(p, mid + 1, end);//对右侧侧快速排序
  }
}
//寻找快速排序划分位置
int findMid(int *p,int start,int end) 
{
  int base = p[start];//第一个数当做比较基准
  while (start < end)//没碰头就一直走
  {
    while (start < end && p[end] >= base)//从尾部往前找比基准小的
    {
      end--;
    }
    swap(&p[start], &p[end]);//找到就换位
    while (start < end && p[start] <= base)//从头部往后找比基准大的
    {
      start++;
    }
    swap(&p[start], &p[end]);//找到就换位
  }
  return start;
}
//入口
int main()
{
  int a[10] = { 1,3,5,7,2,4,8,6,10,9 };
  printArray(a, 10);
  fastSort(a, 0, 9);
  printArray(a, 10);
  return 1;
}


相关文章
|
10天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
36 4
|
1月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
5月前
|
C语言
【C语言】: 快速排序——qsort函数的介绍
【C语言】: 快速排序——qsort函数的介绍
42 0
|
6月前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
47 0
|
存储 算法
玩转快速排序(C语言版)
玩转快速排序(C语言版)
74 0
|
6月前
|
算法 C语言
C语言之冒泡排序、快速排序法、希尔排序法
C语言之冒泡排序、快速排序法、希尔排序法
|
算法 搜索推荐 C语言
c语言写快速排序代码
c语言写快速排序代码
|
6月前
|
搜索推荐 C语言
【c语言】快速排序
【c语言】快速排序
35 0
|
11月前
|
算法 搜索推荐 编译器
一文带你学透快排(快速排序C语言版)
一文带你学透快排(快速排序C语言版)
|
11月前
|
存储 算法 C语言
【数据结构】深入浅出理解快速排序背后的原理 以及 版本优化【万字详解】(C语言实现)
【数据结构】深入浅出理解快速排序背后的原理 以及 版本优化【万字详解】(C语言实现)
78 0