一快排
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;
}