顺序表的增删查改二分查找冒泡和快速排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序表的增删查改二分查找冒泡和快速排序相关的知识,希望对你有一定的参考价值。

SeqList 声明文件

#pragma once

#define MAX_SIZE 5
typedef int DataType;

typedef struct SeqList
{
	DataType array[MAX_SIZE];
	size_t size;
}SeqList;

void PrintSeqList(SeqList* pSeq);
void InitSeqList(SeqList* pSeq);//初始化

void PushBack(SeqList* pSeq, DataType x);//尾插
void PopBack(SeqList* pSeq);//尾删
void PushFront(SeqList* pSeq, DataType x);//头插
void PopFront(SeqList* pSeq);

void Insert(SeqList* pSeq, size_t pos, DataType x);//插入
int Find(SeqList* pSeq, size_t pos, DataType x);//查找
void Erase(SeqList* pSeq, size_t pos);//删除

int Remove(SeqList* pSeq, DataType x);
void RemoveAll(SeqList* pSeq, DataType x);//去重复

void Swap(DataType* left, DataType* right);
void BubbleSort(SeqList* pSeq);//冒泡
void SelectSort(SeqList* pSeq);//void SelectSort_OP(SeqList* pSeq)//选择
int BinarySearch(SeqList* pSeq, DataType x);//二分查找

SeqList实现文件

#include"SeqList.h"
#include<assert.h>
#include<iostream>
#include<string.h>

using namespace std;

void InitSeqList(SeqList* pSeq)
{
	memset(pSeq->array, 0, sizeof(DataType)*MAX_SIZE);
	pSeq->size = 0;
}

void PushBack(SeqList* pSeq, DataType x)
{
	assert(pSeq);
	if (pSeq->size >= MAX_SIZE)
	{
		printf("SeqList is full\n");
		return;
	}
	pSeq->array[pSeq->size] = x;
	pSeq->size++;
}

void PopBack(SeqList* pSeq)
{
	assert(pSeq);
	if (pSeq->size <= 0)
	{
		printf("SeqList is Empty\n");
		return;
	}
	pSeq->size--;
}

void PushFront(SeqList* pSeq, DataType x)
{
	int begin = pSeq->size-1;
	assert(pSeq);
	if (pSeq->size >= MAX_SIZE)
	{
		printf("SeqList is full\n");
		return;
	}
	for (begin; begin >=0; begin--)
	{
		pSeq->array[begin+1] = pSeq->array[begin];
	}
	pSeq->array[0] = x;
	pSeq->size++;
}

void PopFront(SeqList* pSeq)
{
	int begin =0;
	assert(pSeq);
	if (pSeq->size <= 0)
	{
		printf("SeqList is Empty\n");
	}
	for (begin; begin < pSeq->size; begin++)
	{
		pSeq->array[begin] = pSeq->array[begin+1];
	}
	pSeq->size--;
}

void Insert(SeqList* pSeq, size_t pos, DataType x)//插入位置按数组下标顺序
{
	int begin = pSeq->size;
	assert(pSeq);
	assert(pos <= pSeq->size);
	if (pSeq->size >= MAX_SIZE)
	{
		printf("SeqList is full\n");
		return;
	}
	for (begin; begin > pos; begin--)
	{
		pSeq->array[begin] = pSeq->array[begin-1];
	}
	pSeq->array[pos] = x;
	pSeq->size++;
}

int Find(SeqList* pSeq, size_t pos, DataType x)//查找返回数组下标位置
{
	int i = pos;
	assert(pSeq);
	assert(pos <= pSeq->size);
	if (pSeq->size <= 0)
	{
		printf("SeqList is Empty\n");
	}
	for (i; i < pSeq->size; i++)
	{
		if (pSeq->array[i] == x)
		{
			return i;
		}
	}
	return -1;
}

void Erase(SeqList* pSeq, size_t pos)
{
	assert(pSeq);
	assert(pos <= pSeq->size);
	if (pSeq->size <= 0)
	{
		printf("SeqList is Empty\n");
		return;
	}
	for (pos; pos < pSeq->size; pos++)
	{
		pSeq->array[pos] = pSeq->array[pos +1];
	}
	pSeq->size--;
}

void PrintSeqList(SeqList* pSeq)
{
	int i = 0;
	assert(pSeq);
	for (; i < pSeq->size; i++)
	{
		printf("%d ", pSeq->array[i]);
	}
	cout << endl;
}

int Remove(SeqList* pSeq, DataType x)//删除
{
	int pos;
	assert(pSeq);
	pos = Find(pSeq, 0, x);
	if (pos != -1)
	{
		Erase(pSeq, pos);
	}
	return pos;
}

void RemoveAll(SeqList* pSeq, DataType x)//去掉重复
{
	int count = 0;
	int begin = 0;
	assert(pSeq);
	for (; begin < pSeq->size; begin++)
	{
		if (pSeq->array[begin] == x)
		{
			count++;
		}
		else
		{
			pSeq->array[begin - count] = pSeq->array[begin];
		}
	}
	pSeq ->size -= count;
}

void Swap(DataType* left, DataType* right)
{
	DataType tmp = *left;
	*left = *right;
	*right = tmp;
}

void BubbleSort(SeqList* pSeq)//冒泡排序
{
	assert(pSeq);
	int first = 0;
	int second = 0;
	for (first = 0; first < pSeq->size - 1; first++)
	{
		//int Flag = 0;
		for (second = 1; second < pSeq->size - first; second++)
		{
			if (pSeq->array[second - 1] > pSeq->array[second])
			{
				Swap(&pSeq->array[second - 1], &pSeq->array[second]);
				//Flag = 1;
			}
		}
		/*if (Flag == 0)
		{
			return;
		}*/
	}
}

void SelectSort(SeqList* pSeq)//快速排序
{
	assert(pSeq);
	int i, j, max;
	for (j = pSeq->size -1; j >= 0; j--)
	{
		max = j;
		for (i = j-1; i >= 0; i--)
		{
			if (pSeq->array[max] < pSeq->array[i])
			{
				max = i;
			}
		}
		Swap(&pSeq->array[max], &pSeq->array[j]);
	}
}

void SelectSort_OP(SeqList* pSeq)//快排优化
{
	assert(pSeq);
	int i, min, max;
	int left = 0;
	int right = pSeq->size - 1;
	while (left < right)
	{
		for (i = left; i <= right; i++)
		{
			min = left;
			max = right;
			if (pSeq->array[min] > pSeq->array[i])
			{
				Swap(&pSeq->array[left], &pSeq->array[i]);
			}
			if (pSeq->array[max] < pSeq->array[i])
			{
				Swap(&pSeq->array[max], &pSeq->array[i]);
			}
		}
		left++;
		right--;
	}
}

int BinarySearch(SeqList* pSeq, DataType x)//二分查找
{
	int left = 0;
	int right = pSeq->size - 1;
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (pSeq->array[mid] > x)
		{
			right = mid - 1;
		}
		else if (pSeq->array[mid] < x)
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}


测试文件

int main()
{

	SeqList seqlist;
	InitSeqList(&seqlist);
	/*PushBack(&seqlist, 1);
	PushBack(&seqlist, 2);
	PushBack(&seqlist, 3);
	PushBack(&seqlist, 4);
	PrintSeqList(&seqlist);

	PopBack(&seqlist);
	PopBack(&seqlist);
	PopBack(&seqlist);*/

	PushFront(&seqlist, 2);
	PushFront(&seqlist, 1);
	PushFront(&seqlist, 4);
	PushFront(&seqlist, 3);
	PushFront(&seqlist, 5);
	PrintSeqList(&seqlist);

	int key = BinarySearch(&seqlist, 4);
		printf("%d ", key);
		cout << key << endl;
	//BubbleSort(&seqlist);
	//SelectSort_OP(&seqlist);
	PrintSeqList(&seqlist);

	//RemoveAll(&seqlist, 3);
	/*Erase(&seqlist, 0);
	PrintSeqList(&seqlist);
	Erase(&seqlist, 0); 
	Erase(&seqlist, 0); 
	Erase(&seqlist, 0);
	PrintSeqList(&seqlist*/
	//int value = Remove(&seqlist, 4);
	//printf("%d\n", value);
	//Insert(&seqlist, 0, 1);

	//PrintSeqList(&seqlist);

	/*PopFront(&seqlist);
	PopFront(&seqlist);
	PrintSeqList(&seqlist);
	PopFront(&seqlist);
	PopFront(&seqlist);
	PopFront(&seqlist);
	PopFront(&seqlist);*/

	system("pause");
	return 0;
}


本文出自 “星空之梦” 博客,请务必保留此出处http://10739931.blog.51cto.com/10729931/1782980

以上是关于顺序表的增删查改二分查找冒泡和快速排序的主要内容,如果未能解决你的问题,请参考以下文章

查找和排序的基本操作:查找排序算法大集合

Java八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序

Java八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序

14Java常用类(StringBuffer)排序算法(冒泡排序选择排序插入排序快速排序)查找算法(二分查找)

JS冒泡排序,快速排序,二分查找

各种排序方法(冒泡,快速,插入,选择),二分查找