一、排序
|------|-----------------------------|----------|
| 名称 | 稳定性(值相同的两个数据在进行排序后,位置是否会改变) | 时间复杂度 |
| 冒泡排序 | 稳定 | O(n^2) |
| 选择排序 | 不稳定 | O(n^2) |
| 插入排序 | 稳定 | O(n^2) |
| 快速排序 | 不稳定 | O(nlogn) |
| 希尔排序 | 不稳定 | O(nlogn) |
1.时间复杂度为O(n^2) 的排序
先生成随机数,写输入输出函数
cpp
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int Input(int *pArray, int len)
{
int i = 0;
srand(time(NULL)); //生成随机数
for(i = 0; i < len; i++)
{
pArray[i] = rand() % (len * 100);
//取随机数
}
return 0;
}
int OutputArray(int *pArray, int len)
{
int i = 0;
for(i = 0; i < len; i++)
{
printf("%d ", pArray[i]);
}
printf("\n");
}
1.冒泡排序
cpp
int Bullesotr(int *pArray, int len)
{
int i = 0;
int j = 0;
int tmp = 0;
for(j = 0; j < len-1; j++)
{
for(i = 0; i < len-1-j; i++)
{
if(pArray[i] > pArray[i+1])
{
tmp = pArray[i];
pArray[i] = pArray[i+1];
pArray[i+1] = tmp;
}
}
}
return 0;
}
2.选择排序
cpp
int SelectSort(int *pArray, int len)
{
int i = 0;
int j = 0;
int min = 0;
int tmp = 0;
for(j = 0; j < len - 1; j++)
{
for(i = 1; i < len; i++)
{
if(pArray[i] < pArr[min])
{
min = i;
}
if(min != j)
{
tmp = pArray[j];
pArray[i] = pArray[min];
pArray[min] = tmp;
}
}
}
return 0;
}
3.插入排序

cpp
int InsertSort(int *pArray, int len)
{
int i = 0;
int j = 0;
int tmp = 0;
for(j = 1; j <len; j++)
{
tmp = pArray[j];
for(i = 1; i>0 && pArray[i-1] > tmp; i--)
{
pArray[i] = pArray[i-1];
}
pArray[i] = tmp;
}
return 0;
}
2.时间复杂度为O(nlogn)的排序
1.希尔排序

cpp
int ShellSort(int *pArray, int len)
{
int i = 0;
int j = 0;
int step = 0; //步长
int tmp = 0;
for(step = len /2; step >0; step /=2)
{
for(j = step; j < len; j++)
{
tmp = pArray[j];
for(i = j; i > step-1 && pArray[i- step] > tmp; i-=step)
{
pArray[i] = pArray[i -step];
}
pArray[i] = tmp;
}
}
return 0;
}
2.快速排序

cpp
int QuickSort(int *pArray, int low, int high)
{
int i = 0;
int j = 0;
int key = 0;
key = pArray[low];//键值
j = high;
i = low;
while(i<j)
{
while(i<j && pArray[j] >= key)
{
j--;
}
pArray[i] = pArray[j];
while(i<j && pArray[i] <= key)
{
i++;
}
pArray[j] = pArray[i];
}
pArray[i] = key;
if(low < i-1)
{
QuickSort(pArray ,low, i-1);
}
if(i+1 < high)
{
QuickSort(pArray, i+1, high);
}
return 0;
}
二、折半查找
前提:数据排列必须有序

cpp
int MidSerch(int *pArray, int low, int high, int tmp)
{
int Mid = 0;
if(high < low)
{
return -1;
}
Mid = (low + high) / 2;
if(pArray[Mid] > tmp)
{
return MidSerch(pArray, low, Mid-1, tmp);
}
else if(pArray[Mid] < tmp)
{
return MidSertch(pArray, Mid+1, high, tmp);
}
else if(pArray[Mid] == tmp)
{
return Mid;
}
}