0
点赞
收藏
分享

微信扫一扫

1/10日总结

今天听了学长讲的DFS、BFS和快速排序。

感觉DFS和BFS还没有学得很透彻.

先举例快速排序吧。

快速排序的核心思想:每次都取数组的第一个元素作为基准元素,凡是大于这个基准元素的都放在它的右边,凡是小于这个基准元素的都放在它的左边。

具体步骤如下:

①:设置两个变量i和j(我称之为哨兵),令序列的第一个元素作为一个基准元素。

②:i只想序列的最左边,j只想序列的最右边,j从右往左试探,i从左往右试探,直到j找到小于基准的数就停止。i找到大于基准的数就停止。交换i和j指向的两个数,j继续往左试探,i继续往右试探。

③:如果i与j相遇,则i或者j上的元素与基准元素交换,则这一轮排序结束。

对基准元素两边的序列重复以上操作。

举例:对  6,2,7,3,9,8这6个数进行从小到大的排序。

#include<bits/stdc++.h>
using namespace std;
int a[101],n;//全局变量
void quicksort(int left,int right)
{
    int i,j,t,temp;
    if(left>right)
        return;
    temp=a[left];//temp用于存放基准数
    i=left;
    j=right;
    while(i!=j)
    {
        while(a[j]>=temp&&i<j)//先从右往左
            j--;
        while(a[i]<=temp&&i<j)//从左往右
            i++;
        //交换两个数在数组中的位置
        if(i<j)//当i与j没有相遇时
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
    a[left]=a[i];
    a[i]=temp;

    quicksort(left,i-1);//继续处理左边的序列
    quicksort(i+1,right);//继续处理右边的序列
}
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        scanf("%d",&a[i]);

    quicksort(1,n);

    for(i=1; i<=n; i++)
        printf("%d",&a[i]);

    return 0;
}
举报

相关推荐

1月23日学习总结

1月21日学习总结

1月17日学习总结

1月15日学习总结

2022年1月九日学习总结

0 条评论