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;
}