排序
排序
稳定排序:相等的数字位置不变
非稳定排序:相等的数位置变换
内排序:一次性装进内存
外排序:先装到外存,再分步装到内存
插入排序
void insertSort(int *arr, int len)
{
int i, j, tmp;
if(len == 1)
return;
for(i=1; i<len; i++) //从arr[1] 到arr[len - 1]
{
tmp = arr[i]; //从arr[i-1](arr[j])向前面查找插入位置
for(j = i-1; j >=0; j--)
{
if(arr[j] < tmp)
break;
else
{
arr[j+1]=arr[j];
}
}
arr[j+1] = tmp;
}
}
希尔排序
相隔一定间隔局部有序,再整体排序
1.分组
2.插入排序
3.逐步减少增量
void shellSort(int arr[], int n)
{
//缩小增量,以长度8为例,增量变化:4 2 1
for (int gap = n / 2; gap > 0; gap /= 2)
{
//组内排序 元素arr[gap]到arr[n-1]
for (int i = gap; i < n; i++)//
{
int temp = arr[i];
int j; //arr[0]>arr[4]
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
{
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}
冒泡排序
void maopaoSort(int arr[], int n)
{
int i, j;
//需要排序的数组次数
for(i=0; i< (n-1); i++)
{
//数组内排序 5-1 = 4
for(j=0; j < (n-i-1) ; j++)
{
if(arr[j] > arr[j+1])
{
//数据交换
int tmp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
}
}
选择排序
选择排序就是依次从头到尾挑选合适的元素放到前面。如果总共有n个节点,那么选择一个合适的节点需要比较n次,而总共要选择n次,因此总的时间复杂度是O(n2)
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void select(int *p,int len)
{
int i, j, min;
for(i=0; i<len; i++)
{
min = i; //最小值下标
for(j = i+1; j<len; j++)
{
if(p[j] < p[min]) //如果最p[j] 小于 p[min],要更换最小下标
{
min = j;
}
}
swap(&p[i], &p[min]);
}
return;
}
快速排序
快排是一种递归思想的排序算法,先比较其他的排序算法,它需要更多内存空间,但快排的语句频度是最低的,理论上时间效率是最高的。
快速排序的基本思路是:在待排序序列中随便选取一个数据,作为所谓“支点”,然后所有其他的数据与之比较,以从小到大排序为例,那么比支点小的统统放在其左边,比支点大的统统放在其右边,全部比完之后,支点将位与两个序列的中间,这叫做一次划分(partition)。
一次划分之后,序列内部也许是无序的,但是序列与支点三者之间,形成了一种基本的有序状态,接下去使用相同的思路,递归地对左右两边的子序列进行排序,直到子序列的长度小于等于1为止。
void display(int *arr, int len)
{
int i;
for(i=0; i<len; i++)
{
printf("%d\t", arr[i]);
}
printf("\n");
}
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
//找支点
int partion(int *arr, int len)
{
int i, j;
if(len <= 1)
return 0;
i = 0;
j = len-1;
while(i < j)
{
while(arr[i] < arr[j] && i<j)
{
j--;
}
swap(&arr[i], &arr[j]);
while(arr[i] <= arr[j] && i<j)
{
i++;
}
swap(&arr[i], &arr[j]);
}
//返回支点
return i;
}
//快速排序
void quickSort(int arr[],int len)
{
if(len <= 1)
return;
//找支点
int pivort=partion(arr, len);
//左边
quickSort(arr, pivort);
//右边
quickSort(arr+pivort+1, len-pivort-1);
}