排序
#include <stdio.h>
void mySwap(int *a,int i,int j)//交换函数
{
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void mySort(int *a,int len)//普通的冒泡排序
{
int i,j;
for(j = 0; j < len-1; j++)
{
for(i = 0;i < len-1-j; i++)
{
if(a[i]<a[i+1])
{
mySwap(a,i,i+1);
}
}
}
}
void mySort1(int *a,int len)//冒泡排序 递归方法
{
if(len == 1)
return;
int i;
for(i = 0;i < len-1; i++)
{
if(a[i]>a[i+1])
{
mySwap(a,i,i+1);
}
}
mySort1(a,len-1);
}
void myPrint(int *a,int len)//打印函数
{
int i;
for(i = 0;i < len; i++)
{
printf("%2d",a[i]);
}
printf("\n");
}
void mySort2(int *a,int len)//冒泡排序(改进型)
{
int left = 0;
int right = len-1;
int i;
while(left<right)
{
for(i = left; i < right; i++)
{
if(a[i] > a[i+1])
{
mySwap(a,i,i+1);
}
}
right--;
for(i = right; i > left; i--)
{
if(a[i] < a[i-1])
{
mySwap(a,i,i-1);
}
}
left++;
}
}
void mySort3(int *a,int left,int right)//冒泡排序(改进型)递归方法
{
if(left >= right)
return;
int i;
for(i = left; i < right; i++)
{
if(a[i] > a[i+1])
{
mySwap(a,i,i+1);
}
}
right--;
for(i = right; i > left; i--)
{
if(a[i] < a[i-1])
{
mySwap(a,i,i-1);
}
}
left++;
mySort3(a,left,right);
}
void mySort4(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 mySort5(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 mySort6(int *a,int len)//二分插入排序
{
int i;
for(i = 1; i < len;i++)
{
int left = 0;
int right = i-1;
int get = a[i];
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;
}
}
//gap 步数
void mySort7(int *a,int len)//希尔排序
{
int gap = 0;
int i;
while(gap <= len)
{
gap = gap*2+1;
}
while(gap > 0)
{
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;
}
gap = (gap-1)/2;
}
}
void herify(int *a,int index,int len)
{
int lindex = 2*index + 1;//左孩子下标
int rindex = 2*index + 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)
{
mySwap(a,max,index);
herify(a,max,len);
}
}
void mySort8(int *a, int len)//堆排序
{
int i;
//建堆:从非叶节点开始把每一个节点搞成大顶堆
for(i = len/2-1; i > 0; i--)
{
herify(a,i,len);
}
//排序
int count = len;
for(i = len-1; i > 0; i--)
{
//堆顶元素和当前堆最后一个元素进行交换
mySwap(a,0,i);
count-- ;
herify(a,0,count);
}
}
void merge(int *a,int left,int mid,int right,int *temp )
{
int i = left;
int j = mid+1;
int k = 0;
while(i <= mid && j <= right)
{
if(a[i] < a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while(i <= mid)
{
temp[k++] = a[i++];
}
while(j <= right)
{
temp[k++] = a[j++];
}
for(i = 0; i < k; i++)
{
a[left+i] = temp[i];
}
}
void mergeSort(int *a,int left,int right,int *temp)//并归排序
{
int mid = (left + right)/2;
if(left < right)
{
//对左边数组进行归并排序
mergeSort(a,left,mid,temp);
//对右边数组进行归并排序
mergeSort(a,mid+1,right,temp);
//合并左右两个数组
merge(a,left,mid,right,temp);
}
}
int pation(int *a,int left,int right)
{
int pivot = a[right];//以最后一个元素作为基准值
while(left < right)
{
while(a[left] <= pivot && left < right)
{
left++;
}
if(left < right)
{
a[right] = a[left];
right--;
}
while(a[right] >= pivot && left < right)
{
right--;
}
if(left < right)
{
a[left] = a[right];
left++;
}
}
a[left] = pivot;
return left;
}
void quickSort(int *a,int left,int right)//快速排序
{
if(left < right)
{
int pivotIndex = pation(a,left,right);
quickSort(a,left,pivotIndex-1);
quickSort(a,pivotIndex+1,right);
}
}
int main()
{
int a[]={6,3,0,5,1,2,4};
int len = sizeof(a)/sizeof(int);
int temp[20];
//mySort(a,len);
//mySort1(a,len);
//mySort2(a,len);
//mySort3(a,0,len-1);
//mySort4(a,len);
//mySort5(a,len);
//mySort6(a,len);
//mySort7(a,len);
//mySort8(a,len);
//mergeSort(a,0,len-1,temp);
quickSort(a,0,len-1);
myPrint(a,len);
return 0;
}