如下为本人总结整理的常考的查找和排序算法(C语言),若有错误,欢迎批评指正!
目录
一、查找
●顺序查找-监视哨法
typdef struct{
ElemType *elem;
int length;
}SSTable;
int SeqSearch(SSTable ST,ElemType key){
ST.elem[0]=key;//哨兵
for(int i=ST.length;ST.elem[i]!=key;i--);//没错!
return i;
}
●折半查找-只适用有序顺序表
int BinarySearch(SSTable ST,ElemType key){
int low=0;heigh=ST.length-1,mid;
while(low<=heigh){
mid=(low+heigh)/2;
if(ST.elem[mid]==key)return mid;
else if(ST.elem[mid]>key)high=mid-1;
else if(ST.elem[mid]<key)low=mid+1;
}
return -1;//查找失败返回-1
}
二、排序
●冒泡排序(3种写法)
void swap1(int a[],int n){//从后往前冒,从小到大排
for(int i=1;i<n;i++){
bool flag=false;
for(j=n;j>i;j--){
if(a[j-1]>a[j]){
swap(a[j-1],a[j]);
flag=ture;
}
}
if(flag==false)return;//未发生交换
}
}
void swap2(int a[],int n){//从前往后冒,从小到大排
for(int i=n;i>1;i--){
bool flag=false;
for(j=1;j<i;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
flag=ture;
}
}
if(flag==false)return;//未发生交换
}
}
void swap3(int a[],int n){//下标从0开始,从前往后冒,从小到大排
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(a[j]>a[j+1])swap(a[j],a[j+1]);
}
}
}
●快速排序
int Partition(int *arr,int i,int j){
int t=arr[i];//存储基准值
while(i<j){
while(i<j && arr[j]>=t)j--;
if(i<j){//小于基准值左移
arr[i]=arr[j];
i++
}
while(i<j && arr[i]<=t)i++;
if(i<j){//大于基准值右移
arr[j]=arr[i];
j--;
}
}
arr[i]=t;
return i;//返回基准值位置
}
void QuickSort(int *arr,int l,int r){
if(l<r){
int p=Partion(arr,l,r);//划分
QuickSort(arr,l,p-1);
QuickSort(arr,p+1,r);
}
}
●简单选择排序
void SelectSort(LNode &head){//无头结点,链式存储
LNode *p=head,*q,*r;//p为链表位置,q指向元素值最小的结点,r用于遍历
while(p!=NULL){
q=p;
r=p→next;
while(r!=NULL){
if(r→data<q→data)q=r;
r=r→next;
}
int tmp=q→data;
q→data=p→data;
p→data=tmp;
p=p→next;
}
}
●插入排序
#include <stdio.h>
#define N 11
int main() {//插入排序解法1
int a[N],m;
for(int i=0;i<N-1;i++){
scanf("%d",&a[i]);
}
scanf("%d",&m);
a[N-1]=m;//将要插入的数据放到最后
for(int i=0;i<N;i++){
for(int j=N;j>=i;j--){//从小到大排序
if(a[j]<a[j-1]){
int t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
for(int i=0;i<N;i++){
printf("%d ",a[i]);
}
return 0;
}