快速排序--数据结构篇
Posted C语言编程学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序--数据结构篇相关的知识,希望对你有一定的参考价值。
快速排序算法
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)
#include <stdio.h>
#define MAX 255
int R[MAX];
void ShellPass(int d, int n)
{/* 希尔排序中的一趟排序,d为当前增量 */
int i,j;
for(i=d+1;i<=n;i++) /* 将R[d+1..n]分别插入各组当前的有序区 */
{
if(R[i]<R[i-d])
{
R[0]=R[i];j=i-d; /* R[0]只是暂存单元,不是哨兵 */
do /* 查找R[i]的插入位置 */
{
R[j+d]=R[j];/* 后移记录 */
j=j-d; /* 查找前一记录 */
}while(j>0&&R[0]<R[j]);
R[j+d]=R[0]; /* 插入R[i]到正确的位置上 */
} /* endif */
}
} /* end of ShellPass */
void Shell_Sort(int n)
{
int increment=n; /* 增量初值,不妨设n>0 */
do
{
increment=increment/3+1; /* 求下一增量 */
ShellPass(increment,n); /* 一趟增量为increment的Shell插入排序 */
}while(increment>1);
} /* ShellSort */
int main()
{
int i,n;
puts("Please input total element number of the sequence:");
scanf("%d",&n);
if(n<=0||n>MAX)
{
printf("n must more than 0 and less than %d.\n",MAX);
exit(0);
}
puts("Please input the elements one by one:");
for(i=1;i<=n;i++)
scanf("%d",&R[i]);
puts("The sequence you input is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
Shell_Sort(n);
puts("\nThe sequence after shell_sort is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
puts("\n Press any key to quit...");
return 0;
}
你说你喜欢雨,但是你在下雨的时候打伞
你说你喜欢太阳,但你在阳光明媚的时候躲在阴凉的地方
你说你喜欢风,但是在刮风的时候你却关上了窗户
这就是为什么我会害怕你说你也喜欢广告
因为你连“Java编程精简实例”都没有关注
以上是关于快速排序--数据结构篇的主要内容,如果未能解决你的问题,请参考以下文章
Java八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序