PTA_数据结构与算法题目集(中文)_7-12 排序 (25 分)_九种解法

题目地址

题目不分析

我的代码:

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];
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值