几种基本排序算法(二)希尔,快排,归并------直接上代码

希尔排序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define Max 40
//交换数据
void swap(int *str, int pos1, int pos2)
{
int tmp = str[pos1];
str[pos1] = str[pos2];
str[pos2] = tmp;
}

//希尔排序
void ShellSort(int *buf, int len)
{
int i, j, k,tmp;
int increase=len;
while (increase>1)
{
increase = increase / 3 + 1; //确定增量分组
for (i = 0; i < increase;i++)
{
for (j = increase+i; j < len; j+=increase)
{
if (buf[j] < buf[j - increase])
{
tmp = buf[j];
for (k = j - increase; k >= 0&&tmp<buf[k]; k -= increase)
{
buf[k+increase] = buf[k];
}
buf[k + increase] = tmp;
}
}

}
}
}


//打印
void Print(int *str, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf("%d ", str[i]);
}
printf("\n");
}

int main(void)
{
int arr[Max];
int i;
srand((unsigned int)time(NULL));
for (i = 0; i < Max - 1; i++)
{
arr[i] = rand() %100;
}
arr[Max - 1] = '\0';
int len = Max - 1;
printf("排序前:");
Print(arr, len);

printf("排序后:");
ShellSort(arr,len);
Print(arr,len);

system("pause");
return 0;
}

 

快速排序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define Max 10
//交换数据
void swap(int *str, int pos1, int pos2)
{
int tmp = str[pos1];
str[pos1] = str[pos2];
str[pos2] = tmp;
}

//快速排序
void QuickSort(int *buf, int start,int end)
{
int tmp=buf[start]; //基准数
int left = start;
int right = end;
if (left < right)
{
while (left < right)
{
while (left<right&&buf[right]>tmp) //从右边往左找小于基准数的数
{
right--;
}
if (left < right)
{
buf[left] = buf[right];
left++;
}

while (left < right&&buf[left] < tmp) //从左往右找大于基准数的数
{
left++;
}
if (left < right)
{
buf[right] = buf[left];
right--;
}
}
buf[left] = tmp;
QuickSort(buf, start, left - 1);
QuickSort(buf, left + 1, end);
}
}


//打印
void Print(int *str, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf("%d ", str[i]);
}
printf("\n");
}

int main(void)
{
int arr[Max];
int i;
srand((unsigned int)time(NULL));
for (i = 0; i < Max ; i++)
{
arr[i] = rand() % 100;
}
int len = sizeof(arr)/sizeof(int);
printf("排序前:");
Print(arr, len);

printf("排序后:");
QuickSort(arr, 0,len-1);
Print(arr, len);


system("pause");
return 0;
}

 

归并排序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define Max 10
//交换数据
void swap(int *str, int pos1, int pos2)
{
int tmp = str[pos1];
str[pos1] = str[pos2];
str[pos2] = tmp;
}

//合并算法
void Merge(int buf[], int first, int last, int mid, int *tmp)
{
int m = 0;
int i = first;
int j = mid+1;
int length = 0;
//将较小的先放到队列中
while (i <=mid&&j<=last)
{
if (buf[i] < buf[j])
{
tmp[length] = buf[i];
i++;
}
else
{
tmp[length] = buf[j];
j++;
}
length++;
}

while (i <= mid)
{
tmp[length] = buf[i];
i++;
length++;
}
while (j<=last)
{
tmp[length] = buf[j];
j++;
length++;
}

//将排列好的数据放到原数据内存中
for (m =0 ; m < length; m++)
{
buf[m+first] = tmp[m];
}
}

//归并排序
void MergeSort(int buf[], int first, int last, int *tmp)
{
if (first>=last)
{
return;
}
int mid = (first + last) / 2;
//对左边的数进行拆分
MergeSort(buf, first, mid, tmp);
//对右边的数进行拆分
MergeSort(buf, mid+1, last, tmp);
//合并
Merge(buf, first, last, mid, tmp);
}


//打印
void Print(int *str, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf("%d ", str[i]);
}
printf("\n");
}

int main(void)
{
int arr[Max];
int i;
srand((unsigned int)time(NULL));
for (i = 0; i < Max; i++)
{
arr[i] = rand() % 100;
}
int len = sizeof(arr) / sizeof(int);
int *tmp = (int *)malloc(sizeof(len));

printf("排序前:");
Print(arr, len);

printf("排序后:");
MergeSort(arr, 0, len - 1,tmp);
Print(arr, len);


system("pause");
return 0;
}

 

posted on 2016-08-08 01:11  A-祥子  阅读(125)  评论(0)    收藏  举报

导航