#include <stdio.h>
#include <stdlib.h>
void
printf_array(int *array,int len)
{
int i=0;
for(i =0;i<len;i++)
{
printf("%d ",*(array+i) );
//printf("%d ",array[i] );
}
printf("\n");
}
void swap_array(int *array,int i,intk)
{
int temp = *(array+i);
*(array+i) = *(array+k);
*(array+k) = temp;
}
void InsertSort(int *array,intlen)//O(n*n)
{
int i=0,j=0;
int k = -1;
int temp=-1;
for(i=1;i<len;i++)
{
k=i;
temp = *(array+k);
for(j=i-1;(j>=0)&&(*(array+j)> temp);j--)
{
*(array+j+1) = *(array+j);
k =j;
}
*(array+k) =temp;
}
}
void SelectSort(int *array,intlen)//O(n*n)
{
int i=0,j=0;
int k = -1;
for(i=0;i<len;i++)
{
k=i;
for(j=i;j<len;j++)
{
if( *(array+j) < *(array+k))
k = j;
}
swap_array(array,i,k);//找出最小的然后和有序的最后的替换
}
}
void BubblSort(int *array,int len)
{
int i=0;
int j=0;
int exchange=1;
for(i=0;i<len&& exchange;i++)
{
exchange = 0;
for(j=len-1;j>i;j--)
{
if(*(array+j-1)> *(array+j))//如果有逆序,则交换,并记录
{
swap_array(array,j-1,j);
exchange = 1;
}
}
}
printf("exchange times %d\n",i);
}
void ShellSort(int *array,intlen)//O(n*n)
{
int i=0,j=0;
int k = -1,gap;
int temp =-1;
gap = len;
do
{
gap = gap/3+1;//一般取的是3
for(i=gap;i<len;i+=gap)//当最终gap=1;就是插入排序了
{
k=i;
temp = *(array+k);
for(j=i-gap;(j>=0)&&(*(array+j)> temp);j-=gap)
{
*(array+j+gap) =*(array+j);
k = j;
}
*(array+k) =temp;
}
}while(gap> 1);
}
int partition(int *array,int low,int high)
{
int pv;
pv = *(array+low);
while(low < high)
{
//先从高的比较,这个
while((low<high)&& (*(array+high) >=pv))//>=升序排序
{
high--;
}
swap_array(array,low,high);
while((low<high) &&(*(array+low) <= pv ))
{
low++;
}
swap_array(array,low,high);
}
return low;
}
int count;
void QSort(int *array,int low,int high)
{
if(low < high)
{
int pivot =partition(array,low,high);//每划分一次,就把该元素该留的位置确定了。
count++;
printf("count is %d-->%d\n",count,pivot);
QSort(array,low,pivot-1);
QSort(array,pivot+1,high);
}
}
void QuickSort(int *array,int len)
{
QSort(array,0,len-1);
}
void Merge(int *src,int *des,int low,int mid,int high)
{
int i,j,k;
i = low;
j = mid+1;
k = low;
while( (i<=mid)&& (j<=high) )
{
if(*(src+i) < *(src+j))
{
*(des+k) =*(src+i);
k++;
i++;
}
else
{
*(des+k) =*(src+j);
k++;
j++;
}
}
//比较之后剩下的复制到目的地
while( i<=mid)
{
*(des+k) =*(src+i);
i++;
k++;
}
while( j<=high)
{
*(des+k) =*(src+j);
j++;
k++;
}
}
void MSort(int *src,int *des,int low,int high,int max)
{
if(low == high)
{
*(des+low) = *(src+low);
}
else
{
int mid = (low+high) / 2;
//申请临时的空间
int *space = (int*) malloc(sizeof(int) * max);
if( space !=NULL)
{
//稳定的排序,不会有元素一下子跑前面去
MSort(src,space,low,mid,max);
MSort(src,space,mid+1,high,max);
Merge(space,des,low,mid,high);
}
free(space);
}
}
void MergeSort(int *array,int len)
{
//目的和源都是array
MSort(array,array,0,len-1,len);
}
int main(void )
{
int array[]={21,25,49,25,16,8};
int len = sizeof(array) /sizeof(*array);
//SelectSort(&array[0],len);
printf("%d\n",len);
//InsertSort(array,len);
//BubblSort(array,len);
//ShellSort(array,len);
//QuickSort(array,len);
MergeSort(array,len);
printf_array(&array[0],len);
while(1);
return 0;
}
转发至微博
转发至微博