排序

#include "sort.h"
#include <stdio.h>
#include <stdlib.h>






void swap(int *p,int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}


void swap_sort(int arr[],int len)
{
int count = 0;
for (int i=0;i<len-1;++i)
{
  for (int j=i+1;j<len;++j)
{
count ++;
if (arr[i] > arr[j])
{
swap(&arr[i],&arr[j]);
}
}
}
printf("count = %d\n",count);
}






void bubble_sort(int arr[],int len)
{
int count = 0;
for (int i=0;i<len-1;++i)//趟数
{
for (int j=0;j<len-1-i;++j)
{
count ++;
if (arr[j] > arr[j+1])
{
swap(&arr[j],&arr[j+1]);
}
}
}
printf("count = %d\n",count);
}


//  1 2  3  4  5  6   7   8  9   10


void bubble_sort_plus(int arr[],int len)//优化
{
int count = 0;
for (int i=0;i<len-1;++i)//趟数
{
bool flag = 1;//认为它有序
for (int j=0;j<len-1-i;++j)
{
count ++;
if (arr[j] > arr[j+1])
{
flag = 0; //发生交换了,无序
swap(&arr[j],&arr[j+1]);
}
}
if(flag == 1)
{
break;
}
}
printf("count = %d\n",count);
}


// 1,2,3,4,5,6,7
void select_sort(int arr[],int len)
{
for (int i=0;i<len-1;++i)
{
int min_index = i;
for (int j=i+1;j<len;++j)
{
if (arr[min_index]> arr[j])
{
min_index = j;
}
}
if (i != min_index)
{
swap(&arr[i],&arr[min_index]);
}  
}
}


// {44,22,88,66,77,99,11,33,55,100};
void insert_sort(int arr[],int len)
{


for (int k=1;k<len;++k)
{
int temp = arr[k];
int i;
for (i=0;i<k;++i)
{
if (arr[i] > temp)  ///找位置
{
break;
}
}
//i = 3
//腾出位置
for (int j=k-1;j>=i;--j)
{
arr[j+1] = arr[j];
}
//放入
arr[i] = temp;
}
}


void insert_sort_plus(int arr[],int len)
{
for (int i=1;i<len;++i)
{
int temp = arr[i];
int j;
for (j=i-1;j>=0;--j)
{
if (arr[j] > temp)
{
arr[j+1] = arr[j];
}
else
{
break;
}
}
arr[j+1] = temp;
}
}


void shell_insert(int arr[],int len,int gap)
{


}


void shell_sort(int arr[],int len)
{
shell_insert(arr,len,4);
shell_insert(arr,len,2);
shell_insert(arr,len,1);
}








void print(int arr[],int len)
{
for (int i=0;i<len;++i)
{
printf("%d  ",arr[i]);
}
printf("\n");
}


int partition(int arr[],int l,int h)
{                   // l  h
int tmp = arr[l]; // 88 88
while (l < h)  // 只能写 <   不能取 =
{
while (arr[h] >= tmp && l < h)//相等元素
{
h--;
}
swap(&arr[l],&arr[h]);
while (arr[l] <= tmp && l < h)
{
l++;
}
swap(&arr[l],&arr[h]);
}
return l;
}




void quick(int arr[],int low,int high)
{
if (low < high)
{
int mid = partition(arr,low,high);
quick(arr,low,mid-1);
quick(arr,mid+1,high);
}
}


void quick_sort(int arr[],int len)
{
quick(arr,0,len-1);
}


void heap_adjust(int arr[],int start,int end)//8
{
int temp = arr[start];
for(int i=2*start+1;i<=end;i=2*start+1)
{
//左孩子下标
if (2*start+2<=end && arr[2*start+1] < arr[2*start+2])
{
i++; //i下标里面保存的是左右孩子中最大值
}
if(arr[i] > temp)
{
arr[start] = arr[i];
start = i; //start继续往下走
}
else
{
break;
}
}
arr[start] = temp;

}


void heap_sort(int arr[],int len)
{
for (int i=len/2-1;i>=0;--i) //3,2,1,0
{
heap_adjust(arr,i,len-1);//
}
int end = len-1;//最后一个元素的下标
while(end > 0)
{
swap(&arr[0],&arr[end]);
heap_adjust(arr,0,--end);//剩余元素堆调整
}

}








void merger(int arr[],int start,int mid,int end)
{
int *brr = (int *)malloc(sizeof(int) * (end - start + 1));
int low1 = start;
int high1 = mid;
int low2 = mid+1;
int high2 = end;
int i = 0;


while (low1 <= high1  &&  low2 <= high2)
{
if (arr[low1] < arr[low2])
{
brr[i++] = arr[low1++];
}
else
{
brr[i++] = arr[low2++];
}
}
while (low1 <= high1)
{
brr[i++] = arr[low1++];
}
while (low2 <= high2)
{
brr[i++] = arr[low2++];
}


int k = 0;//brr下标
for (int j=start;j<=end;++j)
{
arr[j] = brr[k++];
}
}


void merger_sort(int arr[],int start,int end)
{
if (start < end)
{
int mid = (start + end)/2;
merger_sort(arr,start,mid);
merger_sort(arr,mid+1,end);
merger(arr,start,mid,end);
}



}


void mer_sort(int arr[],int len)
{
merger_sort(arr,0,len-1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值