一、题目
二、算法思想
通过题干所知,要想实现题干的最大最小,就要将最小的放在一边,大的数字放在另一边,且要求两侧数量相同或者差1。所以采用快速排序即可很快满足排序,然后将其分为两个数组S1、S2。
三、代码实现
#include <stdio.h>
/**
* 2016年408算法题
* @return
*/
void quick_sort(int* arr,int start,int end){
if(start >= end)
return;
int left = start;
int right = end;
int pivot = arr[left];
while (left < right)
{
while (arr[right] > pivot && left < right)
{
right--;
}
//跳出循环此时找到 arr【right】 < pivot 情况
//如果还满足left < right
if(left < right)
{
arr[left] = arr[right];
left++;
}
while (arr[left] < pivot && left < right)
{
left++;
}
if(left < right)
{
arr[right] = arr[left];
right--;
}
arr[left] = pivot;
quick_sort(arr,start,left-1);
quick_sort(arr,right+1,end);
// 1 2 5 3 8 9 4
}
}
int main() {
int arr[] = {2,3,5,0,9,34,11,4};
int len = sizeof (arr)/sizeof (arr[0]);
quick_sort(arr,0,len-1);
for (int i = 0; i < len; i++) {
printf("%d ",arr[i]);
}
printf("\n");
int s1[len/2];
int s2[len-len/2];
for(int i=0;i<len/2;++i){
s1[i]=arr[i];
}
for(int i=len/2,j=0;i<len;++i,++j){
s2[j]=arr[i];
}
for (int i = 0; i < len/2; ++i) {
printf("%d ",s1[i]);
}
printf("\n");
for (int i = 0; i < len/2+1; ++i) {
printf("%d ",s2[i]);
}
return 0;
}