我是靠谱客的博主 优美墨镜,最近开发中收集的这篇文章主要介绍直接插入如排序(straight insertion sort),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

接下来的几篇博客都是关于排序的;主要有插入类排序;交换类排序;选择类排序;

插入类排序主要有直接插入如排序(straight insertion sort);折半插入排序(bianry insertion sort); Shell sort;

交换类排序主要有冒泡排序(bubble sort); 快速排序(quick sort);

选择类排序主要有;简单选择排序(simple selection sort); 堆排序(heap sort);

除此之外还有归并排序(merge sort); 基数排序等;

本篇博客是关于直接插入排序的;

排序直接的数据结构介绍;

            所有的排序均以线性表存储;所有的排序算法避免不了交换;交换就要用到临时变量;故将线性表中编号为0的元素不存储任何有效元素;仅仅当做临时变量或者记录的作用来使用;对于有些算法我会给出局部变量做临时变量的算法;若对线性表不是很了解;参见前面关于线性表的博客;

算法大致介绍;

            将待排序的序列分成两个序列;将后一个序列中的元素通过比较、移动、插入的上一个序列;当所有元素都插入完成时;排序完成;

头文件(sort.h);

# ifndef _SORT_

typedef int KeyType;

typedef struct
{
	KeyType key;
}DataType;

# endif

头文件(SeqList.h);

typedef struct
{
	DataType data[MAXSIZE];
	int length;
}SeqList, * PSeqList;

//线性表排序基本准备;
PSeqList Init_SeqList(void);
bool Full_SeqList(PSeqList p);
int Push_SeqList(PSeqList p, KeyType keyValue);
void Traversal_SeqList(PSeqList p);
ostream & operator<<(ostream & os, DataType dataValue);

//基于线性表的排序方法;默认从小到大;
void StraightInsertSort(PSeqList p);

实现文件(SeqList.cpp);

# include "SeqList.h"

PSeqList Init_SeqList(void)
{
	PSeqList p = (PSeqList)malloc(sizeof(SeqList));

	if (NULL != p)
	{
		p->length = 0;
		return p;
	}
	else
	{
		cout << "Memory allocate is error! " << endl;
		system("pause");
		exit(0);
	}
}


bool Full_SeqList(PSeqList p)
{
	if (p->length >= MAXSIZE)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int Push_SeqList(PSeqList p, KeyType keyValue)
{
	if (Full_SeqList(p))
	{
		cout << "SeqList is full! " << endl;

		return -1;
	}

	p->data[p->length].key = keyValue;
	p->length++;

	return 0;
}

void Traversal_SeqList(PSeqList p)
{
	for (int i = 0; i < p->length; i++)
	{
		cout << p->data[i] << " ";
	}
	cout << endl;

	return;
}

ostream & operator<<(ostream & os, DataType dataValue)
{
	cout << dataValue.key;

	return os;
}

//基于线性表的排序方法;默认从小到大;

//直接插入排序;
void StraightInsertSort(PSeqList p)
{
	int i = 0;
	int j = 0;

	for (i = 2; i < p->length; i++)
	{
		//复制到前哨站;
		p->data[0] = p->data[i];

		j = i - 1;
		while (p->data[0].key < p->data[j].key)//必须是大于;不然不是稳定排序;
		{
			//移动元素;
			p->data[j + 1] = p->data[j];
			j--;
		}

		//元素最终移入正确位置;
		p->data[j + 1] = p->data[0];
	}

	return;
}

主函数(Main.cpp);

# include "SeqList.h"

int main(int argc, char ** argv)
{
	int val = 0;
	PSeqList p = Init_SeqList();

	Push_SeqList(p, 300);
	for (int i = 0; i < 10; i++)
	{
		Push_SeqList(p, rand() % 1000);
	}

	cout << "---------------Sort befor---------------" << endl;
	Traversal_SeqList(p);

	cout << endl << "---------------Sort after---------------" << endl;

	//StraightInsertSort(p);
	//BinaryInsertSort(p);
	//BubbleSort(p);
	//QuickSort(p, 1, 10);
	//SelectSort(p);
	//HeapSort(p);
	MergeSort(p->data, p->data, 1, p->length - 1);

	Traversal_SeqList(p);

	system("pause");
	return 0;
}

上面的算法只是对{ 1..........N}的元素进行排序;下面给出对{ 0.......N}的元素进行排序的算法;

分析;前面没有排序0号元素是因为0号元素被当做临时变量使用了,现在自定义一个临时变量代替它就可以了;

void StraightInsertAllSort(PSeqList p)
{
	int i = 0;
	int j = 0;
	DataType tem;

	for (i = 1; i < p->length; i++)
	{
		//复制到局部临时变量;
		tem = p->data[i];


		j = i - 1;
		while (tem.key < p->data[j].key)//必须是大于;不然不是稳定排序;
		{
			//移动元素;
			p->data[j + 1] = p->data[j];
			j--;
		}

		//元素最终移入正确位置;
		p->data[j + 1] = tem;
	}

	return;
}

 

最后

以上就是优美墨镜为你收集整理的直接插入如排序(straight insertion sort)的全部内容,希望文章能够帮你解决直接插入如排序(straight insertion sort)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部