快速排序实现代码:
思路:选取区间关键元素,设置左右下标,从右往左遍历,找到比它小的数字。就把右元素的值赋值给左元素所在的位置,之后从左往右遍历,遇到比关键元素大的,就把左元素的值赋给右元素所在的位置。最终这个关键值将会在它最终排序的位置,所以关键就不用再继续进行排序了。之后再分解为以关键字左右两边进行排序。就能做到快排了。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int array[1002];
void QuickSort(int start,int end)
{
if( start >= end)
return ;
int left = start,right = end;
int key = array[start];
while( left < right)
{
while(array[right] >= key && (left < right))
{
right--;
}
array[left] = array[right];
while(array[left] <= key && (left < right))
{
left++;
}
array[right] = array[left];
}
array[left] = key;
QuickSort(start,left-1);
QuickSort(left+1,end);
return ;
}
int main()
{
srand(time(NULL));
for(int i = 0;i<=100;i++)
{
array[i] = rand()%300;
}
QuickSort(0,100);
for(int i = 0;i<=100;i++)
{
printf("%d ",array[i]);
}
}
归并排序。就是不断分解,直到只剩下两个数的时候,做插入排序。然后就能保证这俩数形成的小数组是有序的了,然后不断回溯回去,将多个小数组,两两做插入排序,再次形成多个小数组。最终形成一个大数组。看到这个介绍可以感受到,复杂度O(nlogn)并且是稳定的。但是归并需要额外的O(n)的辅助空间才能实现两两数组的插入排序。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int array[1002];
int temp[1002];///归并排序需要另外开O(n)的空间用来排序
void ToOne(int start,int mid ,int end)
{
int left = start;//左序列
int cent = mid+1;//右边序列
int t = 0;
while(left <= cent && cent <= end) ///把两边元素填充进temp
{
if(array[left] <= array[cent])
{
temp[t++] = array[left++];
}
else
{
temp[t++] = array[cent++];
}
}
while(left <= mid) ///把剩余元素填充进temp
{
temp[t++] = array[left++];
}
while(cent <= end)
{
temp[t++] = array[cent++];
}
t = 0;
while(start <= end)
{
array[start++] = temp[t++];
}
}
void mergesort(int start,int end)
{
if(start < end)
{
int mid = (end - start) / 2 + start; ///等同于 (end+start)/2 防止溢出
mergesort(start,mid);
mergesort(mid+1,end);
ToOne(start,mid,end);
}
}
int main()
{
srand(time(NULL));
for(int i = 0;i<=100;i++)
{
array[i] = rand()%300;
}
mergesort(0,100);
for(int i = 0;i<=100;i++)
{
printf("%d ",array[i]);
}
}