排序算法累计ing

不同的排序算法

保持学习ing

#include<iostream>
using namespace std;
#define N 11
#define true 1
#define false 0
typedef struct Sqlist{
	int r[N];
	int length=0;
}Sqlist;

void DispM(Sqlist *L);

void CreatSqlist(Sqlist *L);

void BubbleSort(Sqlist *L);/*冒泡排序*/

void EazySort(Sqlist *L);/*简单排序*/

void StraightSort(Sqlist *L);/*直接插入排序法*/

void XiErSort(Sqlist *L);/*希尔排序*/

void HeatSort(Sqlist *L);/*堆排序*/
void HeadJust(Sqlist *L, int s, int m);
void swap(Sqlist *L, int n, int m);

void MergeSort(Sqlist *L);/*归并排序*/
void MSort(int SR[], int TR[], int s, int t);
void Merge(int SR[], int TR[], int s,int m,int n);

void FastSort(Sqlist *L);/*快速排序*/
void FSort(Sqlist *L, int low, int high);
int Partition(Sqlist *L, int low, int high);
#include"Sort.h"
#include<time.h>
#include <stdlib.h>
using namespace std;

void DispM(Sqlist *L){
	if (L != NULL){
		for (int i = 1; i < N; i++){
			cout <<i<<" :"<<L->r[i] <<" "<< endl;
		}
	}
}
void CreatSqlist(Sqlist *L){
	srand((unsigned int)time(NULL));
	int a = 100, b = 1;
	L->length = 0;
	for (int i = 1; i < N; i++){
		L->r[i]=(rand() % 99 + 1);
		L->length++;
	}
	//DispM(L);
}

void BubbleSort(Sqlist *L){
	int i, j;
	int t = 0;
	for (i = 1; i < L->length + 1; i++){//顺序
		for (j = i + 1; j < L->length + 1; j++){
			if (L->r[i] >L->r[j]){
				t = L->r[j];
				L->r[j] = L->r[i];
				L->r[i] = t;
			}
		}
	}
	/*for (i = 1; i < L->length + 1; i++){//倒序
		for (j = L->length; j >= i; j--){
			if (L->r[i] >L->r[j]){
				t = L->r[j];
				L->r[j] = L->r[i];
				L->r[i] = t;
			}
		}
	}*/
	/*排除已经是顺序的数组段*/
	int flag = true;
	for (i = 1; i < L->length + 1&&flag; i++){
		flag = false;
		for (j = i + 1; j < L->length + 1; j++){
			if (L->r[i] >L->r[j]){
				t = L->r[j];
				L->r[j] = L->r[i];
				L->r[i] = t;
				flag = true;
			}
		}
	}
	//DispM(L);
}

void EazySort(Sqlist *L){
	int i, j, min;
	int t = 0;
	CreatSqlist(L);
	DispM(L);
	for (i = 1; i < L->length + 1; i++){
		min=i;
		for (j = i + 1; j < L->length + 1; j++){
			if (L->r[min]>L->r[j]){
				min = j;//找到后面的最小值,然后更换
			}
		}
		if (i!=min){
			t = L->r[min];
			L->r[min] = L->r[i];
			L->r[i] = t;
		}
	}
	DispM(L);
}

void StraightSort(Sqlist *L){/*对于已经排好的序列来说,再次插入一个值*/
	int i, j;
	CreatSqlist(L);
	DispM(L);//从小到大排列
	for (i = 2; i <= L->length; i++){//寻找需要排序的点
		if (L->r[i] < L->r[i - 1]){
			L->r[0] = L->r[i];
			for (j = i - 1; L->r[j] > L->r[0]; j--){
				L->r[j + 1] = L->r[j];//后移
			}
			L->r[j + 1] = L->r[0];
		}
	}
	for (i = 2; i <= L->length; i++){
		if (L->r[i - 1] > L->r[i]){
			L->r[0] = L->r[i - 1];
			for (j = i; L->r[j] < L->r[0]; j--){

			}
		}
	}
	DispM(L);
}

void XiErSort(Sqlist *L){
	int i, j;
	CreatSqlist(L);
	int increment = L->length;
	while (increment > 1){
		increment = increment / 3 + 1;
		for (i = increment + 1; i < L->length; i++){
			if (L->r[i] < L->r[i - increment]){
				L->r[0] = L->r[i];
				for (j = i - increment; j > 0 && L->r[0] < L->r[j]; j -= increment){
					L->r[j + increment] = L->r[j];
				}
				L->r[j + increment] = L->r[0];
			}
		}
	}
	DispM(L);
}

void HeatSort(Sqlist *L){
	CreatSqlist(L);
	int i;
	for (i = L->length / 2; i > 0; i--){//i会往后走一半  所以i的范围就变换一半
		HeadJust(L,i,L->length);
	}

	for (i = L->length; i > 1; i--){
		swap(L,1,i);
		HeadJust(L,1,i-1);
	}
	DispM(L);
}

void swap(Sqlist *L, int n, int m){
	int temp;
	temp = L->r[n];
	L->r[n]=L->r[m];
	L->r[m] = temp;
}

void HeadJust(Sqlist *L, int s, int m){//完成进行一个最大堆排序,s是排序数值的一半,
	int temp, j;
	temp = L->r[s];
	for (j = 2 * s; j <= m; j *= 2){//对于完全二叉树来说,s是中间结点;2*s是左孩子,2*s+1是右孩子。
		if (j < m&&L->r[j] < L->r[j + 1]){//选择一个较大的
			++j;
		}
		if (temp >= L->r[j]){//此时说明中间结点是二叉树中较大的
			break;
		}
		L->r[s] = L->r[j];//顶点赋予最大值。
		s = j;
	}
	L->r[s] = temp;
}

//归并 排序  未按完成
void MergeSort(Sqlist *L){
	CreatSqlist(L);
	//DispM(L);
	MSort(L->r, L->r, 1, L->length);/*无法给SR TR 赋值*/
	DispM(L);
}

void MSort(int SR[], int TR1[], int s, int t){
	int m;
	int TR2[N+1];
	if (s == t){
		TR1[s] = SR[s];
	}
	else
	{
		m = (s + t) / 2;//应用递归 将数组分半 ,一直到数组数为1,
		MSort(SR,TR2,s,m);//分别处理左半部分
		MSort(SR,TR2,m+1,t);//处理右半部分
		Merge(TR2,TR1,s,m,t);//将其合并
	}
}

void Merge(int SR[], int TR[], int i, int m, int n){
	int j, k,l;
	for (j = m + 1, k = i; i <= m&&j <= n; k++){
		if (SR[i] < SR[j]){
			TR[k] = SR[i + 1];
		}
		else{
			TR[k] = SR[j + 1];
		}
	}
	if (i <= m){
		for (l = 0; l <= m - i; l++){
			TR[k + 1] = SR[i + 1];
		}
	}
	if (j <= n){
		for (l = 0; l <= n - j; l++){
			TR[k + 1] = SR[j + 1];
		}
	}
}

/*快速排序算法*/
void FastSort(Sqlist *L){
	CreatSqlist(L);
	DispM(L);
	FSort(L, 1, L->length);/*当前排序的最小值到当前排序的最大值*/
	DispM(L);
}

void FSort(Sqlist *L, int low, int high){
	int point;//point是位于low和high的中间位置
	if (low < high){
		point=Partition(L, low, high);
		FSort(L, low, point - 1);
		FSort(L,point+1,high);
	}
}

//这核心就是围绕着选择的基准点p进行处理(p,Low往右大于p的元素,high小于p的元素,三者进行一个交换)
int Partition(Sqlist *L, int low, int high){
	int pointkey = L->r[low];
	while (low < high){/*括号里的两个循环,先设置一个基准点p,找到high小于p的进行交换,然后找到low大于p的进行交换,*/
		/*找到右边小于基准点的位置*/
		while (low < high&&L->r[high] >= pointkey)
			high--;
		swap(L, low,high);//进行交换
		/*找到左边大于基准点的点*/
		while (low < high&&L->r[low] <= pointkey)
			low++;
		swap(L,low,high);//进行交换
	}
	return low;
}

void main(){
	Sqlist *L;
	L = new Sqlist;
	//CreatSqlist(L);
	//BubbleSort(L);
	//EazySort(L);
	//StraightSort(L);
	//StraightSort(L);
	//XiErSort(L);
	//HeatSort(L);
	//MergeSort(L);
	FastSort(L);
	system("pause");
}

有n个数,要求输入一个数,把它插到数列中,使得数列仍然有序,并输出新数列

先输入乱序的数,将其存在数组中,再用排序法排好

再找到输入一个数所在数组中介于哪些数之间

记下该值所归属的位置

再用for从后往前替换

//有n个数,要求输入一个数,把它插到数列中,使得数列仍然有序,并输出新数列
#include<stdio.h>
#define N 10
#define M 11
int main()
{

	int a[N];
	int i = 0, j = 0, k, t, q;

	printf("please input %d numbers : \n", N);
	for (i = 0; i < N; i++)
	{
		scanf_s("%d", &a[i]);
	}
	printf("输出数组 \n");

	for (i = 0; i < N; i++) {
		printf("%d", a[i]);
	}
	printf("\n");

	//冒泡排序法
	for (i = 0; i < N - 1; i++)
		for (j = 0; j < N - i - 1; j++)
			if (a[j] > a[j + 1])
			{
				k = a[j];
				a[j] = a[j + 1];
				a[j + 1] = k;
			}
	printf("从小到大排序后输出\n");
	for (i = 0; i < N; i++) {
		printf("%d", a[i]);
	}


	//插到一个序列中
	printf("请输入一个数t:\n");
	scanf_s("%d", &t);
	printf("%d\n",t);
	//找出t所在的位置
	for (i = 0; i < N; i++)
	{
		if (t >= a[i] && t <= a[i + 1])
		{
			q = i+1;
			
		}
	}

	//再将i之后的值往前移一位
	for (j = N - 1; j >= q; j--)
	{
		a[j + 1] = a[j];
	}
	a[q] = t;
	
	for (i = 0; i < M; i++)
	{
		printf("%d", a[i]);
	}
	return 0;

}

在这里插入图片描述

冒泡排序java实现

public class Sort
{
	public static void main(String[] args)
	{
		int t;
		int[] a={25,24,3,9,8,55,101,999,65,33,996,5};
		for(int i=0;i<a.length;i++)
			for(int j=i+1;j<a.length;j++)
		{
			if(a[i]>a[j])
			{
				t=a[j];
				a[j]=a[i];
				a[i]=t;
			}
		}

		for(int i=0;i<a.length;i++)
		{
			System.out.println(a[i]);
		}
	}
}

在这里插入图片描述
这种题刚刚开始学编程的时候,表示难以理解,现在哈哈哈可以

生成随机数排序

这里是一个生成随机数的过程,包括数组空间随机生成 数组元素随机生成 +冒泡排序。

import java.util.Random;
public class Sort
{
	public static void main(String[] args)
	{

		//生成一个乱序的数组
		Random rand=new Random();
		int[] a=null;
		a=new int[rand.nextInt(10)];//开辟数组空间  每次也是随机的

		for(int i=0;i<a.length;i++)
		{
			a[i]=rand.nextInt(999);
			System.out.println(a[i]);
		}

		System.out.println(a.length);
		int t;
		//int[] a={25,24,3,9,8,55,101,999,65,33,996,5};
		for(int i=0;i<a.length;i++)
			for(int j=i+1;j<a.length;j++)
		{
			if(a[i]>a[j])
			{
				t=a[j];
				a[j]=a[i];
				a[i]=t;
			}
		}

		for(int i=0;i<a.length;i++)
		{
			System.out.println(a[i]);
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值