快速排序
快速排序是对鼓泡排序的改进。 其基本思想是,将躺着排序的数据分割成独立的两个部分,其中一个部分的所有数据小于其他部分的所有数据,通过以下方式分别高速地对这两个部分的数据进行排序,从而递归地进行整个排序过程算法可能是先找到某个元素的准确位置,再将该元素前后分成两半,找不到就移动,找不到就分配值具体来说,先移动h,找不到大于val的就分配值,找不到小于val的就分配值l和h赋值(l指向第一个元素,h指向最后一个元素,val保存第一个元素的值)。 一旦分配完成就不移动! l和h重叠了就不用找了。 只要记住一点就行了。 向左搜索大于关键字(val )的分配值(如果找不到则向右移动,向右搜索小于关键字(val )的分配值),如果找不到则向左移动)。 然后利用递归思想(排序后,对关键字两侧执行的操作相同)。
举例说明
938659776132749 )//初始关键字
[27 38 13] 49 [76 97 65 49] //在完成第二次分隔后,对应于递归树的第二段
[13] 27 [38] 49 [49 65] 76 [97] //上一层的每个无序划分完成后,对应于递归树的第三层
13 27 38 49 49 [65] 76 97 //上一层的每个无序划分完成后,对应于递归树的第四层
13 27 38 49 49 65 76 97 //最后排序结果
实例代码
#包含
#包含
语音快速排序(int *,int,int,int );
intfindpos(int*,int,int );
int num=0; 保存//num排序的执行次数
int main () )
{
intarr [ ]={ 49、38、65、97、76、13、27、49 };
int i;
intn=sizeof(arr )/sizeof (int ); //用n保存数组的长度
printf(************快速排序算法(*******************(n(n ) ) ) ) ) )
快速排序(arr,0,n-1,n );//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标
printf (((n--------------共排序了%d次! -----------n ',num;
printf ('快速排序后的元素为');
for(I=0; I
printf('%d ',arr[i] );
getch (; //暂停程序,等待用户输入任意键退出程序
返回0;
}
/*进行快速排序,确定第一个元素的准确位置,并将元素分成两半。 左半部分和右半部分的算法是一样的。 */
语音快速排序(int * a,int low,int high,int n ) )。
{
int pos=0;
int i;
低电平
{
pos=findpos(a,low,high ); //确定要素的正确位置
printf ('第%d次旋转排序后的要素)、num );
for(I=0; I
printf('%d ',a[i] );
printf((n );
快速排序(a,low,pos-1,n ); //前一半排序
快速排序(a,pos 1,high,n ); //按后半部分排序
}
}
intfindpos(int*a,int low,int high ) )。
{
int val=a[low]; //val作为关键字
while
{
是wile(low=val )
--high;
a[low]=a[high];
while
行;
a[high]=a[low];
退出while循环后的low和high的值必须相等
a[low]=val;
返回低;
}
执行结果:
注意:
排序算法有三个度量标准:时间复杂度、空间复杂度和稳定性。 稳定性是指排序前两个相等的数字可以确保序列的前后位置的顺序和排序后两个前后位置的顺序相同。 例如,甲(60 )、乙)、丙)排序结束后,甲方此前就表示该排序算法稳定,但运行结果第3次和第4次结果相同,表明是快速排序不稳定的排序算法
结束语
数据结构的学习暂时告一段落,关于数据结构有很多需要学习的东西。 毕竟,数据结构是我们如何存储数据及其关系(重点)的有力武器,数据结构便于研究线性和非线性(因为我们的内存是线性一维的,通常将非线性结构转换为线性结构进行存储)的问题。 从明天开始学习算法!