关于快速排序,其实它跟冒泡排序一样,也是一种交换排序算法,但是他比冒泡排序快速的多,减少了比较次数和移动交换次数,是冒泡排序的升级。
下面先讲一些必要的定义吧:
快速排序的基本思想是: 通过一趟排序将带排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列的目的。
枢轴:通过Partition函数,先选取当中的一个关键字,然后想尽办法把它放到一个i额位置,使得他左边的值都比它小,右边的值都比它大,我们将这样的关键字称为枢轴。
直接上代码:
#include<stdio.h> #include <stdlib.h> #include <time.h> #define TRUE 1 #define FALSE 0 #define MAXSIZE 9 #define random(x) (rand()%x) typedef int ElemType, Status; typedef struct { //定义一个线性表的顺序存储结构 ElemType data[MAXSIZE]; int length; }SqList; /*将列表中的数据进行展示*/ void display(SqList L) { int i; for(i = 0; i <L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); } /*将顺序表L中的i和j两个位置进行交换*/ void swap(SqList *L, int i, int j){ ElemType temp = L->data[i]; L->data[i] = L->data[j]; L->data[j] = temp; } /* 交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置 此时在它之前(后)的记录均不大于(小) 它 */ int partition(SqList *L, int low, int high) { int pivotKey = L->data[low]; //用字表的第一个记录作枢轴记录 while(low < high) { //从表的两端交替向中间扫描 while((low < high) && L->data[high] >= pivotKey) { //一定要记得=号,否则在一些情况下会造成死循环 high--; } // printf("high : %d ", high); swap(L, low, high); //将比枢轴记录小的记录交换到低端 while((low < high) && L->data[low] <= pivotKey) { //一定要记得=号,否则在一些情况下会造成死循环 low++; } // printf("low : %d \n", low); swap(L, low, high);//将比枢轴记录大的记录交换到高端 } return low; //返回枢轴所在的位置 } /* 对顺序表L中的子序列L->data[low..high]作快速排序 因为该方法需要递归调用,所以必须外封装成一个函数 */ void qSort(SqList *L, int low, int high) { int pivot; //枢轴值 if(low < high) { pivot = partition(L, low, high); //将L->data[low,,high]一分为二 //printf("pivot : %d \n", pivot); qSort(L, low, pivot - 1); //将低子表进行递归排序 qSort(L, pivot + 1, high); //将高子表进行递归排序 } } /* 快速排序 */ void quickSort(SqList *L) { qSort(L, 0, L->length - 1); } int main() { srand((int)time(NULL)); //用当前的时间作为随机数种子,这样就能保证每次运行时都能取到不同的随机数序列 SqList s; int i = 0; s.length = 0; for(i; i < MAXSIZE; i++) { //创建一个原始栈并为其赋值 s.data[i] = random(MAXSIZE); s.length++; } printf("数组的长度 : %d\n原始数组为 : ", s.length); display(s); quickSort(&s); printf("经过排序后 :"); display(s); }
由于我的测试数据是随机生成的,下面只列出运行结果之一:
数组的长度 : 9 原始数组为 : 0 5 0 1 3 5 7 1 7 经过排序后 :0 0 1 1 3 5 5 7 7 请按任意键继续. . .
相关推荐
C语言版快速排序的完成代码,欢迎交流讨论
- `quick_sort.c`:快速排序算法的C语言源代码文件,展示了如何在C语言环境中实现快速排序的函数和主程序。 - `quick_sort.h`:可能包含了快速排序函数的声明,便于在其他模块中调用。 - `main.c`或`test.c`:测试...
在C语言中实现链表快速排序,首先需要理解链表和快速排序的基本概念。链表不同于数组,它不连续存储数据,而是通过指针连接各个节点。每个节点包含数据元素和指向下一个节点的指针。快速排序的核心是“分区操作”和...
c语言版本的数据结构的快速排序算法,适用于新手学习
快速排序c语言
这是一个快排的程序,用c写的,经过我亲测,可以运行,有需要的小伙伴可以下载作为参考
快速排序c语言
在C语言中实现快速排序,通常包含以下几个步骤: 1. **选择基准值(Pivot Selection)**:选择数组中的一个元素作为基准,常见的方法有选取第一个元素、最后一个元素或中间元素,也可以随机选取。 2. **分区操作...
数据结构中的快速排序实现,用递归实现的C语言快速排序程序。
希尔排序和快速排序是两种经典的计算机编程中的排序算法,它们都是在C语言环境中实现的。本文将详细探讨这两种排序算法的原理、实现细节以及在实际应用中的优缺点。 希尔排序,由希尔(Donald Shell)在1959年提出...
快速排序c语言
算法导论版的快速排序的完整实现。C语言版。免积分送给需要的朋友。
快速排序c语言代码文件 快速排序是一种基于分治法的排序算法,其中 通过选择枢轴元素(从数组中选择的元素)将数组划分为子数组。 在划分数组时,枢轴元素的位置应使小于枢轴的元素保留在左侧,大于枢轴的元素位于枢...
C语言快速排序.pdf 快速排序(Quick Sort)是一种高效的排序算法,具有良好的时间复杂度和空间复杂度。快速排序的实现基于分治法,具体分为三个步骤:分解、解决和合并。 在分解步骤中,序列被划分成两个可能为空...
这是一个用C语言实现的快速排序的程序,它实现了对一个英文文本中的单词排序并将排序结果输出到另外一个文件中。
快速排序c语言
本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...
在C语言中,快速排序的实现通常采用递归的方法。下面是一个简单的快速排序函数的实现: ```c void quick_sort(int *x, int low, int high) { int i, j, t; if (low ) { i = low; j = high; t = *(x + low); //...
给定一个数列,用快速排序算法把它排成升序。 输入: 第一行是一个整数n,表示要排序的数的个数;下面一行是用空格隔开的n个整数。 输出: 输出排序后的数列,每个数字占一行。 输入样例: 5 3 2 1 4 5
使用双向链表实现快速排序,C语言,有详细注释