线性表的2种常用排序、2种查找算法

408几种大题常用排序、查找算法

排序算法:快速排序、归并排序
查找:折半查找、顺序遍历查找

排序

1.快速排序

void Quick_Sort(int *arr, int begin, int end){//携带起点与终点,全算法精髓,“快速”的真谛:每轮运算的规模减半
    if(begin > end)
        return;
    int tmp = arr[begin];
    int i = begin; //i作为第一次的基准数(j动他才动)
    int j = end;//(j从后往前)
    while(i != j){
        while(arr[j] >= tmp && j > i)//从后往前,j指针先向左移,j先动,所以写在循环外面
            j--;
        while(arr[i] <= tmp && j > i)//i从前往后
            i++;
        if(j > i){//交换i,j顺序
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }
    arr[begin] = arr[i];//当i,j指向同一节点时,交换首节点和i指向的位置
    arr[i] = tmp;
    Quick_Sort(arr, begin, i-1);
    Quick_Sort(arr, i+1, end);
}

2.归并排序

外部通过比较分流(Merge函数),内部递归实现(Mergesort)

void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex){
    int i = startIndex, j=midIndex+1, k = startIndex;
    while(i!=midIndex+1 && j!=endIndex+1) {
        if(sourceArr[i] > sourceArr[j])
            tempArr[k++] = sourceArr[j++];
        else
            tempArr[k++] = sourceArr[i++];
    }
    while(i != midIndex+1)
        tempArr[k++] = sourceArr[i++];
    while(j != endIndex+1)
        tempArr[k++] = sourceArr[j++];
    for(i=startIndex; i<=endIndex; i++)
        sourceArr[i] = tempArr[i];
}
 
//内部使用递归
void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex) {
    int midIndex;
    if(startIndex < endIndex) {
        midIndex = startIndex + (endIndex-startIndex) / 2;//避免溢出int
        MergeSort(sourceArr, tempArr, startIndex, midIndex);
        MergeSort(sourceArr, tempArr, midIndex+1, endIndex);
        Merge(sourceArr, tempArr, startIndex, midIndex, endIndex);
    }
}
 
int main(int argc, char * argv[]) {
    int a[8] = {50, 10, 20, 30, 70, 40, 80, 60};
    int i, b[8];
    MergeSort(a, b, 0, 7);
    for(i=0; i<8; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

3.插入排序

常规插入排序
void StraightSort(int *arr,int len)
{
	int tmp;
	int i;
	int j;
	for (i = 1;i < len;i++)
	{
		tmp = arr[i];
		for (j = i - 1;j >= 0 && arr[j] > tmp;j--)
		{
			arr[j + 1] = arr[j];
		}
		arr[j + 1] = tmp;
	}
}
希尔排序
void ShellSort(int *arr,int len)
{
	for (int gap = len/2;gap > 0;gap = gap/2)
	{
		for (int i = gap;i < len;i++)
		{
			int j = i;
			while (j - gap >= 0 && arr[j] < arr[j - gap])
			{
				Swap(arr,j,j - gap);
				j = j - gap;
			}
		}
	}
}

查找

1.折半查找

一直查到mid == key ,查找成功。

#include<stdio.h>
#define NUM 10

int a[]={6,12,28,37,54,65,69,83,90,92};

int BinarySearch(int s[],int n,int key)
{
    int low,high,mid;
    low=0;
    high=n-1;
    while(low<=high)
    {
        mid=(low+high)/2;   //计算中间元素序号
        if(s[mid]==key)     //中间元素与关键字相等,查找成功
            return mid;
        else if(s[mid]>key)         //中间元素大于关键字
            high=mid-1;
        else
            low=mid+1;
    }
    return -1;      //查找失败返回-1
}

int main()
{
    int key,pos;
    printf("原数据为:");
    for(int i=0;i<NUM;i++)
        printf("%d ",a[i]);
        printf("\n");
    printf("请输入关键字:");
    scanf("%d",&key);
    pos=BinarySearch(a,NUM,key);
    if(pos>=0)
        printf("查找成功!在第%d位!",pos+1);
    else
        printf("查找失败!");
    return 0;

}


2.顺序遍历查找(线性表基本操作)

#include<stdio.h>
#define N 10
int main()
{
	int a[N],i,x;
	for(i=0;i<N;i++)
        scanf_s("%d",&a[i]);
	scanf_s("%d",&x);
	for (i = 0; i < N; i++)
	{
		if (x == a[i])
			break;
	}
	if(i<N)
		printf("Index is %d\n", i);
	else
		printf("Not Found");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值