快排,原理不多说,网上都有,直接撸代码
#include <stdio.h>
void swap(int *arr, int i,int j)
{
int tmp = arr[i];
arr[i] =arr[j];
arr[j] = tmp;
}
int partition(int *arr,int left,int right)
{ //左右指针法
int i =left;
int j =right;
int tmp = arr[i];
int key = i;
while(i < j)
{
while(i<j && arr[j] >= tmp)
{
j--;
}
while(i<j && arr[i] <=tmp)
{
i++;
}
swap(arr,i ,j);
}
swap(arr,i,key);
return i;
}
int partition2(int *arr,int left,int right)
{//挖坑法
int key = arr[left];
while(left < right)
{
while(left<right && arr[right] >=key)
right--;
arr[left] = arr[right]; //赋值,然后right作为新坑
while(left < right && arr[left] <= key)
left++;
arr[right] =arr[left]; //left作为新坑
}
arr[left] = key; //将key赋值给left和right的相遇点,保持key的左边都是比key小的数,key的右边都是比key大的数
return left;//最终返回中间位置
}
void quickSort(int *arr,int left,int right)
{
int d;
if(left < right)
{
//d = partition(arr, left,right);
d= partition2(arr,left,right);
quickSort(arr,left,d-1 );
quickSort(arr,d+1,right);
}
}
int main(void)
{
int i;
int arr[] ={1,2,3,4,5,9,8,7,6,0};
quickSort(arr,0,9);
for(i =0 ;i< 10;i++)
{
printf("%d ",arr[i]);
}
}