今天听了学长讲的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;
}