一快排
emmmm....宝宝写的快排和我学习的快排
//20180419 今天晚上准备来学习快速排序算法而写
#include <cstdio>
#include <cstring>
int array[20];
const int N = 1e5 + 10;
void swap(int &a , int &b)
{
int c = a;
a = b;
b = c;
return ;
}
void QuickSort(int left , int right)
{
/*
这个函数是为了将left到right区间的所有值按照第left个值的大小来划分成三部分
这三部分分别是 比array[left]个值小的 第array[left]个值 和 比它大的
递归分下去 排序就完成了 但是需要注意在数据有序或者接近有序的时候复杂度爆炸O(N*N)这个样子
*/
// printf("GG");
// printf("left == %d right == %d\n",left, right);
if (left >= right)//递归到了最小的区间 返回就好了
return ;
int value = array[left];//把基准数字存起来好了 但是好像没有必要啊 有点蠢这个操作
int i , j ;
i = left ;
j = right;
while (i != j) {
while (array[j] >= array[left] && j != i) j --;
while (array[i] <= array[left] && i != j) i ++;
if (i == j)break;
swap(array[i] , array[j]);
}
swap(array[left] , array[i]);
QuickSort(left , i - 1);
QuickSort(i + 1, right);
}
int main()
{
printf("请输入十个待排序的数字:");
for (int i = 0 ; i < 10 ; i ++) {
scanf("%d",array + i);
}
QuickSort(0 , 9);
for (int i = 0 ; i < 10 ; i ++)
printf("%d ",array[i]);
printf("\n");
}
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[101],n;
void qsort(int l,int r)
{
int i,j,temp,t;
if(l>r)
return ;
temp=a[l];//temp里存的是基准数
i=l;
j=r;
while(i!=j)
{
while(a[j]>=temp&&i<j)//从右边开始找
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j)//交换在数组中的位置
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//将基准数归位、
a[l]=a[i];
a[i]=temp;
qsort(l,i-1);//继续处理左边的,递归
qsort(i+1,r);//右边
}
int main()
{
int i,j,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
qsort(1,n);//调用快排
for(i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
二.桶排序
//输入n个0~1000之间的整数,将他们排序。
#include<stdio.h>
int main()
{
int book[1001],i,j,t,n;
for(i=0;i<=1000;i++)
book[i]=0;//初始化为0
scanf("%d",&n);//输入一个数n,表示接下来有n个数
for(i=1;i<=n;i++)//循环读入n个数,并进行桶排序
{
scanf("%d",&t); //把每一个数读到变量t中
book[t]++; //进行计数
}
for(i=0;i<=1000;i++)//从小到大依次判断编号1000~0的桶
// for(i=1000;i>=0;i--) //从大到小依次判断编号1000~0的桶
for(j=1;j<=book[i];j++) //出现了几次就将桶的编号打印几次
printf("%d ",i);
printf("\n");
return 0;
}