题目不分析
我的代码:
1、 qsort
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main()
{
int n, aa[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &aa[i]);
qsort(aa, n, sizeof(int), cmp);
for (int i = 0; i < n; i++)
printf("%d%c", aa[i], i < n - 1 ? ' ' : '\n');
return 0;
}
2、 Bubble
#include<stdio.h>
int main()
{
int n, aa[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &aa[i]);
for (int i = 0; i < n; i++)
{
int flag = 1;//use to order jump
for (int j = 0; j < n - 1 - i; j++)//j < n - 1 - i, every j++ ,
if (aa[j] > aa[j + 1]) //one big to correct position,
{ //so shorten one
int cab = aa[j + 1];
aa[j + 1] = aa[j];
aa[j] = cab;
flag = 0;
}
if (flag)
break;
}
for (int i = 0; i < n; i++)
printf("%d%c", aa[i], i < n - 1 ? ' ' : '\n');
return 0;
}
3、 insert_list
#include<stdio.h>
#include<stdlib.h>
typedef struct num {
int nu;
struct num * np;
}nn, *np;
np fp = (np)malloc(sizeof(nn));
void insert(np nwp);
void insert(np nwp, np tp, np prep);
void swap(np n1, np n2);
int main()
{
int n;
fp->np = NULL;
scanf("%d %d", &n, &fp->nu);//head node
for (int i = 1; i < n; i++)
{
np nwp = (np)malloc(sizeof(nn));
nwp->np = NULL;
scanf("%d", &nwp->nu);
insert(nwp);
}
printf("%d", fp->nu);
fp = fp->np;
while (fp)
{
printf(" %d", fp->nu);
fp = fp->np;
}
//printf("%d%c", aa[i], i < n - 1 ? ' ' : '\n');
return 0;
}
void insert(np nwp)//insert head node
{
if (nwp->nu < fp->nu)
{
np tp = (np)malloc(sizeof(nn));
swap(tp, fp);
fp->nu = nwp->nu;
fp->np = tp;
}
else insert(nwp, fp->np, fp);//need the pre_node to link list
return;
}
void insert(np nwp, np tp, np prep)
{
if (!tp)
prep->np = nwp;
else if (nwp->nu < tp->nu)
{
nwp->np = tp;
prep->np = nwp;
}
else
insert(nwp, tp->np, tp);
return;
}
void swap(np n1, np n2)
{
n1->nu = n2->nu;
n1->np = n2->np;
}
4 、shell_sedgewick
#include<stdio.h>
#include<math.h>
int main()
{
int n, aa[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &aa[i]);
int si = 0;
while (9 * pow(4, si) - 9 * pow(2, si) + 1 < n / 2)
si++;//establish sedgewick range
for (; si >= 0; si--)
{
int t = 9 * pow(4, si) - 9 * pow(2, si) + 1;
//only used partly of sedgewick sequence
for (int i = 0; i < t; i++)
for (int j = i + t; j < n; j += t)
{
int cab = aa[j];
int k = j;
//this code segment is insertSort improve
for (; k - t >= 0 && aa[k - t] > cab; k -= t)
aa[k] = aa[k - t];
aa[k] = cab;
}
}
for (int i = 0; i < n; i++)
printf("%d%c", aa[i], i < n - 1 ? ' ' : '\n');
return 0;
}
5、 merge Recursive
#include<stdio.h>
int bb[100000];
void mergeSort(int aa[100000], int lo, int hi);
void mergeKernel(int aa[100000], int lo, int mid, int hi);
int main()
{
int n, aa[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &aa[i]);
mergeSort(aa, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d%c", aa[i], i < n - 1 ? ' ' : '\n');
return 0;
}
void mergeSort(int aa[100000], int lo, int hi)
{
if (lo >= hi) return;
int mid = lo + (hi - lo) / 2;
mergeSort(aa, lo, mid);
mergeSort(aa, mid + 1, hi);
mergeKernel(aa, lo, mid, hi);
return;
}
void mergeKernel(int aa[100000], int lo, int mid, int hi)
{
for (int i = lo; i <= hi; i++)
bb[i] = aa[i];//bb to auxiliary
int left = lo, right = mid + 1;
for (int i = lo; i <= hi; i++)
{
if (left > mid) aa[i] = bb[right++];//left is exhuasted
else if (right > hi) aa[i] = bb[left++];//right is exhuasted
else if (bb[left] > bb[right])aa[i] = bb[right++];
else aa[i] = bb[left++];
}
return;
}
6、 merge Non-recursive
#include<stdio.h>
#define MIN(A,B) ((A)<(B)?(A):(B))
int aux[100000];
void merge(int aa[100000], int lo, int mid, int hi);
int main()
{
int n, aa[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &aa[i]);
for (int i = 1; i < n; i *= 2)
for (int lo = 0; lo < n - i; lo += 2 * i)//little group of operation
merge(aa, lo, lo + i - 1, MIN(lo + 2 * i - 1, n - 1));
for (int i = 0; i < n; i++)
printf("%d%c", aa[i], i < n - 1 ? ' ' : '\n');
return 0;
}
void merge(int aa[100000], int lo, int mid, int hi)
{
for (int i = lo; i <= hi; i++)
aux[i] = aa[i];
int left = lo, right = mid + 1;
for (int i = lo; i <= hi; i++)
{
if (left > mid) aa[i] = aux[right++];
else if (right > hi) aa[i] = aux[left++];
else if (aux[left] > aux[right])aa[i] = aux[right++];
else aa[i] = aux[left++];
}
return;
}
7、 heap
#include<stdio.h>
int n, aa[100001];
void insert(int val, int i);
void adjust(int tail);
void swab(int * a, int * b)
{
int c = *a;
*a = *b, *b = c;
}
int main()
{
aa[0] = 0x3f3f3f3f;
scanf("%d %d", &n, &aa[1]);
for (int i = 2, val; i < n + 1; i++)
{
scanf("%d", &val);
insert(val, i);
}
for (int i = 0,tail=n; i < n; i++)
{
int cab = aa[1];//always use the most number to correct position
aa[1] = aa[tail--];
aa[tail + 1] = cab;
adjust(tail);
}
for (int i = 1; i < n + 1; i++)
printf("%d%c", aa[i], i < n ? ' ' : '\n');
return 0;
}
void insert(int val, int i)
{
if (val <= aa[i / 2])//intsert tail to front
aa[i] = val;
else
{
int tt = i;
while (val > aa[tt / 2] && tt / 2 != 0)
{
aa[tt] = aa[tt / 2];
tt /= 2;//father to son
}
aa[tt] = val;//new father new big
}
return;
}
void adjust(int tail)
{
int i = 1, j = i * 2;
while (j<=tail)
{
//choice the most of the three number
if (j + 1 <= tail && aa[j] < aa[j + 1])j = j + 1;
//if son biger than father which need swap, else the task is accomplish.
if (aa[i] < aa[j])swab(&aa[i], &aa[j]);
else break;
//the next cycle.
i = j, j *= 2;
}
return;
}
8、 sort
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, aa[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &aa[i]);
sort(aa, aa+n);//outset to end
for (int i = 0; i < n; i++)
printf("%d%c", aa[i], i < n-1 ? ' ' : '\n');
return 0;
}
9、 quick
#include<stdio.h>
#include<math.h>
void swab(int *a, int *b)
{
int c = *a;
*a = *b, *b = c;
}
void quick(int aa[], int left, int right);
void sedgewick(int aa[], int sta, int num);
int median(int aa[], int left, int right);
int main()
{
int n, aa[100000];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &aa[i]);
quick(aa, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d%c", aa[i], i < n - 1 ? ' ' : '\n');
return 0;
}
void quick(int aa[], int left, int right)
{
if (right - left > 5000)
{
int low = left, high = right - 1, pivot = median(aa, left, right);
while (1)
{
while (low + 1 < right && aa[++low] < pivot);
while (high - 1 > left && aa[--high] > pivot);
if (low < high)
swab(&aa[low], &aa[high]);
else break;
}
if (aa[low] > aa[right - 1])//confirm pivot position
swab(&aa[low], &aa[right - 1]);
if (low - 1 - left > 0)
quick(aa, left, low - 1);
if (right - low - 1 > 0)
quick(aa, low + 1, right);
}
else
sedgewick(aa, left, right - left + 1);
return;
}
void sedgewick(int aa[], int sta, int num)
{
int si = 0;
while (9 * pow(4, si) - 9 * pow(2, si) + 1 < num / 2)
si++;
for (; si >= 0; si--)
{
int t = 9 * pow(4, si) - 9 * pow(2, si) + 1;
for (int i = sta; i < sta + t; i++)
for (int j = i + t; j < sta + num; j += t)
{
int cab = aa[j];
int k = j;
for (; k - t >= sta && aa[k - t] > cab; k -= t)
aa[k] = aa[k - t];
aa[k] = cab;
}
}
return;
}
int median(int aa[], int left, int right)
{
int center = (left + right) / 2;//choice pivot
if (aa[left] > aa[center])swab(&aa[left], &aa[center]);
if (aa[left] > aa[right])swab(&aa[left], &aa[right]);
if (aa[center] > aa[right])swab(&aa[center], &aa[right]);
swab(&aa[center], &aa[right - 1]);
return aa[right - 1];
}