YTU算法学习——排序

1.冒泡法排序

题目描述

用冒泡法对输入的 10 个字符从小到大排序。

输入

长度为 10的字符串,仅包含字母,数字。

输出

按 ASCII 排好序的字符串

输入输出样例

样例输入 #1

qwertyuiop​

样例输出 #1

eiopqrtuwy

代码 :

#include<iostream>
#define N 10
using namespace std;
int main()
{
	char a[N + 1];
	int m, i, j;
	cin.getline(a, N + 1);//输入
	for (i = 0; i < N - 1; i++)//冒泡排序
	{
		for (j = 0; j < N - 1 - i; j++)
		{
			if (a[j] > a[j + 1])
			{
				char ch = a[j];
				a[j] = a[j + 1];
				a[j + 1] = ch;
			}
		}
	}
	for (i = 0; i < N; i++)//输出
	{
		cout << a[i];
	}
	cout << endl;
	return 0;
}

 2.快速排序法:

题目描述

以某个数为标准,把比这个数大的都移到它的后面,比这个数小的都移到它的前面,这样它后面的任意一个数都比它前面的任意一个数大,再将这前后两组数再分别重复这一过程,最后就会得到有序的数列;

补充:如果从大到小排列可以将比这个数大的都移到它的前面,比这个数小的都移到它的后面.

快速排序从小到大排序算法描述:

1)设置两个变量first、last,令first等于一组数的第一个数的下标,last等于一组数的最后一个数的下标;

2)以某个数组元素作为关键数据(这里将这组数的第一个数作为关键数据),赋值给key,即key=A[first];

3)从last开始向前搜索,即由后开始向前搜索(last--),找到第一个小于key的值A[last],将A[last]给A[first];

4)从first开始向后搜索,即由前开始向后搜索(first++),找到第一个大于key的A[first],将A[first]给A[last];

5)重复第3、4步,直到first=last,将key的值给a[first];

6)将first两边的两组数分别再进行排序,重复1、2、3、4、5步;直到每组只剩一个数排序结束.

现在,我们的题目来了...

输入一组整数,将这组整数从小到大排列。

输入

输入n和n个整数

输出

从小到大输出

输入输出样例

样例输入 #1

10
2 1 3 5 4 6 8 7 9 10

样例输出 #1

1 2 3 4 5 6 7 8 9 10 

代码:

#include<iostream>
using namespace std;
void Quicksort(int a[], int low, int high)
{
    int first = low;
    int last = high;
    int key = a[first];
    if (low >= high)
    {
        return;
    }
    while(first<last)
    {
        while (a[last] >= key&&first<last)
        {
            last--;
         }
        a[first] = a[last];
        while (a[first] <= key && first < last)
        {
            first++;
        }
        a[last] = a[first];
    }
    a[first] = key;
    Quicksort(a, low, first - 1);
    Quicksort(a, last + 1, high);
}
int main()
{
    int i, a[100], x, n = 0;
    cin >> n;
    for (i = 0; i < n; i++)
        cin >> a[i];
    Quicksort(a, 0, n - 1);
    for (i = 0; i <= n - 1; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

3.快速排序法的递归实现: 

题目描述

输入

一列整数

输出

从小到大排序的数列

输入输出样例

样例输入 #1

11 55 14 63 88 47 31 24 11 0

样例输出 #1

0 11 11 14 24 31 47 55 63 88

 代码:

#include<iostream>
#define LENTH 10
using namespace std;
int AdjustArray(int s[], int left, int right)
{
	int i = left, j = right;
	int key = s[left];
	while (i < j)
	{
		while (s[j] >= key && i < j)
		{
			j--;
		}
		if(i<j)s[i++] = s[j];
		while (i < j && s[i] <= key)
		{
			i++;
		}
		if(i<j)s[j--] = s[i];
		
	}
	s[i] = key;
	return i;
}
void QuickSort(int s[], int left, int right)
{
	if (left >= right)
	{
		return;
	}
	int mark = AdjustArray(s, left, right);
	QuickSort(s, left, mark - 1);
	QuickSort(s, mark + 1, right);
}
int main()
{
	int arr[LENTH];
	for (int i = 0; i < LENTH; i++)
	{
		cin >> arr[i];
	}
	QuickSort(arr, 0, LENTH - 1);
	for(int i=0;i<LENTH;i++)
	{
		cout << arr[i]<<" ";
	}
	cout << endl;
	return 0;
}

4.堆排序:

输入

输入n和n个整数

输出

从小到大输出

输入输出样例

样例输入 #1

10
2 1 3 4 6 5 7 9 8 10

样例输出 #1

1 2 3 4 5 6 7 8 9 10 

代码: 

#include<iostream>
using namespace std;
void HeapAdjust(int arr[], int i, int n)
{
	arr[0] = arr[i];
	for (int j = i * 2; j <= n; j *= 2)
	{
		if (j<n&&arr[j] < arr[j + 1])
		{
			j++;
		}
		if (arr[j] < arr[0])break;
		else
		{
			arr[i] = arr[j];
			i = j;
		}
	}
	arr[i] = arr[0];
}
void HeapSort(int arr[],int n)
{
	for (int i = n / 2; i >= 1; i--)
	{
		HeapAdjust(arr, i, n);
	}
	for (int j = n; j > 1; j--)
	{
		int temp = arr[1];
		arr[1] = arr[j];
		arr[j] = temp;
		HeapAdjust(arr, 1, j - 1);
	}
}
int main()
{
	int n, arr[100];
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> arr[i];
	}
	HeapSort(arr, n);
	for (int i = 1; i <= n; i++)
	{
		cout << arr[i] << ' ';
	}
	cout << endl;
	return 0;
}

5.归并排序 :

输入

n和n个整数

输出

从小到大排序

输入输出样例

样例输入 #1

10
2 1 3 5 4 6 7 9 8 10

样例输出 #1

1 2 3 4 5 6 7 8 9 10 

代码: 

#include<iostream>
#include<cstring>
using namespace std;
void Merge(int arr[],int temp[], int begin, int mid, int end)
{
	int i = begin, j = mid+1, k = begin;
	while (i != mid + 1 && j != end + 1)
	{
		if (arr[i] > arr[j])
			temp[k++] = arr[j++];
		if (arr[i] <= arr[j])
			temp[k++] = arr[i++];
	}
	while (j != end + 1)
	{
		temp[k++] = arr[j++];
	}
	while (i != mid + 1)
	{
		temp[k++] = arr[i++];
	}
	for (int r = begin; r <= end; r++)
	{
		arr[r] = temp[r];
	}
}
void MergeSort(int arr[], int temp[], int begin, int end)
{
	if (begin < end)
	{
		int mid = begin + (end - begin) / 2;
		MergeSort(arr, temp, begin, mid);
		MergeSort(arr, temp, mid + 1, end);
		Merge(arr, temp, begin, mid, end);
	}
}
int main()
{
	int  n, arr[100];
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
	}
	int temp[100];
	memset(temp, 0, sizeof(temp));
	MergeSort(arr,temp,0,n-1);
	for (int i = 0; i < n; i++)
	{
		cout << arr[i] << ' ';

	}
	cout << endl;
	return 0;
}

6.希尔排序: 

题目描述

给你10个数,设计一个程序,实现希尔插入排序算法,并输出这个序列的希尔排序过程。

输入

1行10个数,两个数之间有空格隔开,所有数均不超过10910^9109

输出

每个排序过程输出一行,直到排序完成。

输入输出样例

样例输入 #1

9 8 7 6 5 4 3 2 1 0

样例输出 #1

4 3 2 1 0 9 8 7 6 5
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

代码: 

#include<iostream>
using namespace std;
int main()
{
    int arr[12];
    for (int i = 1; i <= 10; i++)
    {
        cin >> arr[i];
    }
    int d, j;
    for (d = 10 / 2; d >= 1; d = d / 2)
    {
        for (int i = d + 1; i <= 10; i++)
        {
            if (arr[i] < arr[i - d])
            {
                arr[0] = arr[i];
                for (j = i - d; j > 0 && arr[0] < arr[j]; j -= d)
                {
                    arr[j + d] = arr[j];

                }
                arr[j + d] = arr[0]; 
            }
        }
        for (int k = 1; k <= 10; k++)
        {
            cout << arr[k] << ' ';
        }
        cout << endl; 
    }
    return 0;
}

7.基数排序:

输入

 输入n和n个整数

输出

从小到大排序

输入输出样例

样例输入 #1

10
2 1 3 4 6 5 7 9 8 10

样例输出 #1

1 2 3 4 5 6 7 8 9 10 

代码: 

#include <iostream>
#include <string.h>
using namespace std;
/* 获取输入数字的索引值,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */
int get_index(int num, int order)
{
    while(--order)
        num/=10;
    return num%10;
}
/* 进行基数排序 */
void radix_sort(int arr[], int len, int dec, int order)
{
    int i, j;
    int index;                      /* 排序索引 */
    int tmp[1001];                  /* 临时数组,用来保存待排序的中间结果 */
    int num[10];                    /* 保存索引值的数组 */
    memset(num, 0, 10*sizeof(int)); /* 数组初始清零 */
    memset(tmp, 0, len*sizeof(int));/* 数组初始清零 */
    if (dec < order)                /* 最高位排序完成后返回 */
        return;
    for (i=0; i<len; i++)
    {
        index = get_index(arr[i],order);    /* 获取索引值 */
        num[index]++;                       /* 对应位加一 */
    }
    for (i=1; i<10; i++)
        num[i] += num[i-1];                 /* 调整索引数组 */
    for (i=len-1; i>=0; i--)
    {
        index = get_index(arr[i], order);/* 从数组尾开始依次获得各个数字的索引 */
        j = --num[index];                   /* 根据索引计算该数字在按位排序之后在数组中的位置 */
        tmp[j] = arr[i];                    /* 数字放入临时数组 */
    }
    for (i=0; i<len; i++)
        arr[i] = tmp[i];                                     /* 从临时数组复制到原数组 */
    // 继续按高一位的数字大小进行排序
    radix_sort(arr, len, dec, order + 1);
    return;
}
int main()
{
    int i,n;
    int arr[1001];
    cin>>n;
    for(i=0; i<n; i++)
        cin>>arr[i];
    int dec=3;      /* 最多处理位数 */
    int order= 1;   /* 排序的位数,1代表个位、2代表十位、3代表百位 */
    /* 排序函数,从个位开始 */
    radix_sort(arr, n, dec, order);
    for (i=0; i<n; i++)
        cout<<arr[i]<<" ";
    cout<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值