顺序表的增删查改二分查找冒泡和快速排序
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八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序