#include <stdio.h>
void my_print(int *a,int len)
{
int i;
for(i = 0;i<len;i++)
{
printf("%-4d",a[i]);
}
printf("\n");
}
void my_swap(int *a,int i,int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
//冒泡排序
void buble_sort(int *a,int len)
{
int i, j;
for (i=0; i < len-1; i++) // 将最大元素沉底的次数
{
for (j = 0; j < len-1-i; j++) // 将当前数组最大元素沉底
{
if (a[j] > a[j+1])
{
mySwap(a, j, j+1); // 交换
}
}
}
}
//鸡尾酒排序
void upbuble_sort(int *a,int len)
{
int i;
int left = 0;
int right = len-1;
while(left<right)
{
for(i=left;i<right;i++)
{
if(a[i]>a[i+1])
{
my_swap(a,i,i+1);
}
}
right--;
for(i=right;i>left;i--)
{
if(a[i]<a[i-1])
{
my_swap(a,i,i-1);
}
}
left++;
}
}
//选择排序
void choose_sort(int *a,int len)
{
int i, j;
for (i = 0; i < len-1; i++) // 找的次数
{
int min = i;
for (j = i+1; j < len; j++)
{
if (a[min] > a[j])
{
min = j;
}
}
if (min != i)
mySwap(a, min, i);
}
}
//插入排序
void insert_sort(int *a,int len)
{
int i;
for (i = 1; i < len; i++)
{
int get = a[i];
int j = i-1;
while (j >= 0 && a[j]>get)
{
a[j+1] = a[j];
j--;
}
a[j+1] = get;
}
}
//二分法插入排序
void newinsert_sort(int *a,int len)
{
int i;
for (i = 1; i < len; i++)
{
int get = a[i];
int left = 0;
int right = i-1;
while (left <= right)
{
int mid = (left+right)/2; // 中间元素的下标
if (a[mid] > get)
right = mid-1;
else
left = mid+1;
}
// 移位
int j;
for (j = i-1; j >= left; j--)
a[j+1] = a[j];
a[left] = get;
}
}
//希尔排序
void hill_sort(int *a,int len)
{
int gap = 1;
while(gap < len)
{
gap = gap*3+1;
}
while (gap > 0)
{
int i;
for (i = gap; i < len; i++)
{
int get = a[i];
int j = i-gap;
while (j >= 0 && a[j]>get)
{
a[j+gap] = a[j];
j -= gap;
}
a[j+gap] = get;
}
printf ("gap = %d : ", gap);
myPrint(a, len);
gap = gap / 3;
}
}
//堆排序
void herify(int *a,int index,int len)
{
int lindex = index*2+1;
int rindex = index*2+2;
int max = index;
if(lindex<len&&a[max]<a[lindex])
max = lindex;
if(rindex<len&&a[max]<a[rindex])
max = rindex;
if(max != index)
{
my_swap(a,max,index);
herify(a,max,len);
}
}
void stack_sort(int *a,int len)
{
int i;
for(i=len/2-1;i>=0;i--)
{
herify(a,i,len);
}
int count = left;
for(i=len-1;i>0;i--)
{
my_swap(a,0,i);
count--;
herify(a,0,count);
}
}
//归并排序
void merge(int *a,int left,int mid,int right,int *tmp)
{
int i = left;
int j = mid+1;
int k = 0;
while(i<=mid&&j<=right)
{
if(a[i]<a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while(i<=mid)
{
tmp[k++] = a[i++];
}
while(j<=right)
{
tmp[k++] = a[j++];
}
for(i=0;i<k;i++)
{
a[left+i] = tmp[i];
}
}
void merge_sort(int *a,int left,int right,int *tmp)
{
int mid = (left+right)/2;
if(left<right)
{
merge_sort(a,left,mid,tmp);
merge_sort(a,mid+1,right,tmp);
merge(a,left,mid,right,tmp);
}
}
//快速排序
int partion(int *a,int left,int right)
{
int pviot = a[right];
while(left<right)
{
while(a[left]<=pviot&&left<right)
{
left++;
}
if(left<right)
{
a[right] = a[left];
right--;
}
while(a[right]>=pviot&&left<right)
{
right--;
}
if(left<right)
{
a[left] = a[right];
left++;
}
}
a[left] = pviot;
return left;
}
void quickSort(int *a,int left,int right)
{
if(left<right)
{
int pviotIndex = partion(a,left,right);
quickSort(a,left,pviotIndex-1);
quickSort(a,pviotIndex+1,right);
}
}
int main()
{
int a[]={1,3,5,0,2,6,8,7,9,4};
int len = sizeof(a)/sizeof(a[0]);
int tmp[10];
//buble_sort(a,len);
//newinsert_sort(a,len);
//hill_sort(a,len);
//upbuble_sort(a,len);
//stack_sort(a,len);
//quickSort(a,0,len-1);
merge_sort(a,0,len-1,tmp);
//choose_sort(a,len);
//insert_sort(a,len);
my_print(a,len);
return 0;
}
排序
最新推荐文章于 2024-03-28 00:29:10 发布