快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。大概算法是先找到某一元素的确切位置,再把该元素前后分成两半,没找到就移动,找到就赋值!具体做法是先移H,左边找到比val大的就赋值,右边找到比它小的就赋值!L和H赋值(L指向第一个元素,H指向最后一个元素,val存放第一个元素的值)。一旦赋值完就不移动!L和H重合了就不需要找了。只要记住一点就行了:左边找比关键字(val)大的就赋值(没找到就向右移),右边找比关键字(val)小的就赋值(没找到就向左移)。
然后利用递归的思想(排序依次后,对关键字两边执行的操作是一样的)。
举例说明
49 38 65 97 76 13 27 49] //初始关键字
[27 38 13] 49 [76 97 65 49] //第1次划分完成之后,对应递归树第2层
[13] 27 [38] 49 [49 65] 76 [97] //对上一层各无序区划分完成后,对应递归树第3层
13 27 38 49 49 [65] 76 97 //对上一层各无序区划分完成后,对应递归树第4层
13 27 38 49 49 65 76 97 //最后的排序结果
实例代码
#include<stdio.h>
#include<conio.h>
void QuickSort(int *,int,int,int);
int FindPos(int *,int,int);
int num=0;//num用来保存排序进行的趟数
int main()
{
int arr[]={49,38,65,97,76,13,27,49};
int i;
int n=sizeof(arr)/sizeof(int);//用n存放数组长度
printf("***************** 快速排序算法 ******************\n\n");
QuickSort(arr,0,n-1,n);//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标
printf("\n------------- 总共进行了 %d 趟排序!-----------\n",num);
printf("快速排序后的元素为:");
for(i=0;i<n;++i)
printf("%d ",arr[i]);
getch();//暂停程序,等待用户输入任意键退出程序
return 0;
}
/*进行快速排序,确定第一个元素的确切位置,并将元素分成两半,左边一半和右边一半算法相同,*/
void QuickSort(int *a,int low,int high,int n)
{
int pos=0;
int i;
if(low<high)
{
pos=FindPos(a,low,high);//确定元素的确切位置
printf("第%d趟排序后的元素:",++num);
for(i=0;i<n;++i)
printf("%d ",a[i]);
printf("\n");
QuickSort(a,low,pos-1,n);//前一半进行排序
QuickSort(a,pos+1,high,n);//后一半进行排序
}
}
int FindPos(int *a,int low,int high)
{
int val=a[low];//val作为关键字
while(low<high)//每趟排序都从右边开始
{
while(low<high&&a[high]>=val)
--high;
a[low]=a[high];
while(low<high&&a[low]<=val)
++low;
a[high]=a[low];
}//终止while循环之后low和high的值一定是相等的
a[low]=val;
return low;
}
运行结果:
注意:
排序算法有3个衡量标准:时间复杂度,空间复杂度,稳定性。稳定性就是能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。比如甲(60)、乙、丙(60)排完序后甲还是在前面就说明这种排序算法稳定,但从运行结果可以看到第3趟和第四趟结果是一样的,这说明快速排序是一种不稳定的排序算法。
结束语
数据结构的学习暂时告一段落,有关数据结构还有很多东西要去学,毕竟数据结构是我们如何存储数据及它们之间的关系(重点) 的一个有力武器,数据结构为我们研究线性和非线性(因为我们的内存是线性一维的,所以通常把非线性结构转化为线性结构来进行存储)问题提供了方便。 明天开始学习算法!
分享到:
相关推荐
快速排序是一种高效的排序算法,它使用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。在C语言中实现快速排序,通常涉及到以下几个关键知识点: 1. 递归函数:快速排序的核心是递归...
文章首先解释了快速排序的基本原理,即通过分治法选择基准元素并进行分区操作,递归排序子数组,实现O(n log n)的平均时间复杂度。接着讨论了优化策略,包括三数取中法和尾递归优化,以减少递归深度和提升排序效率。...
### 快速排序法的C++实现 #### 算法概述 快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔于1960年提出。它的基本思想是采用分治策略来把一个序列分为较小的两部分,然后递归地对这两部分进行排序...
快速排序(Quick Sort)是一种高效的排序算法,基于分治法原理,通过选择基准元素将数组分为两部分,然后递归地排序这两部分。快速排序的平均时间复杂度为 O(n log n),最坏情况下为 O(n²),但通过优化选择基准的...
在编程领域,C语言是一种广泛使用的底层编程语言,它的...总之,掌握C语言排序法对于任何C语言开发者来说都是基础且重要的技能。无论是学习理论知识还是实际编程,这些排序算法都将为你在解决问题时提供有力的工具。
快速排序是一种高效的交换排序,采用分治策略,通过一次划分操作将数组分为两部分,一部分的所有元素都小于另一部分,然后递归地对这两部分进行快速排序。C语言实现如下: ```cpp int Partition(int r[], int ...
快速排序是一种高效的排序算法,由C. A. R. Hoare在1962年提出。它是基于分治策略的,通常比其他简单的排序算法,如冒泡排序,具有更快的平均性能。快速排序的基本思想是通过一趟排序将待排序的数据分成两部分,一...
内容概要:本文详细解析了快速排序算法的实现原理,重点介绍了分治法的核心逻辑和递归实现的关键点。主要内容包括快速排序的基本原理、选择基准值、分区操作以及递归排序子数组的步骤。文中提供了具体的Python实现...
### 快速排序详解 #### 一、快速排序的基本概念 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出。它采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地...
内容概要:文章详述了快速排序算法的基本概念、分治策略以及具体实现方式,提供Java和Python两个版本的代码样例。快速排序算法能够将一个序列分解成较小和较大的两部分,并通过递归的方式分别对这两部分进行排序,...
### 快速排序知识点详解 #### 一、快速排序简介 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出。其核心思想是采用分治法(Divide and Conquer)策略来把一个序列分为较小...
快速排序(Quick Sort)是一种非常高效的排序算法,采用分治法(Divide and Conquer)策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。快速排序在实际应用中的平均性能很好,其平均时间...
而快速排序则是一种更为高效的排序算法,它使用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。具体实现中,选取一个元素作为基准,将小于基准的所有元素都移到基准的左边,大于基准...
### 数据结构快速排序算法实现详解 #### 实验目标与背景 快速排序算法是计算机科学领域中一种非常高效且常用的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)于1959年提出。它采用分治法策略来实现对数据...
- **快速排序**:快速排序是一种非常高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。 - **分区过程**:快速排序的核心是分区过程。选取一个基准值,通过一趟...
快速排序(Quick Sort)是一种高效的排序算法,由C. A. R. Hoare在1960年提出。它采用分治法(Divide and Conquer)的策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。快速排序在实现时,...
快速排序是一种高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。它由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出,并在1961年发表。 #### 二、快速...
主要内容涵盖快速排序的基本思想、数组划分、递归排序、基准元素选取的方法,如首元素、尾元素、随机元素以及‘三数取中’法。此外,文中还讨论了快速排序在最优和最差条件下的性能表现、空间复杂度的优化方法及其几...
C语言快速排序算法实现详解 本文将对C语言中实现快速排序算法的源代码进行详细的解释和分析,旨在帮助读者深入理解快速排序算法的实现原理和C语言的编程技巧。 快速排序算法简介 快速排序(QuickSort)是一种基于...
快速排序是一种高效的排序算法,它采用分治法策略,将一个数组分为较小和较大的两个子数组,然后递归排序两个子数组。快速排序的思想可以概括为三步:选择基准元素、分区、递归排序子数组。下面详细介绍快速排序的...