给定一个数组,将奇数放到前面,偶数放到后面,各自排好序
(2016年3月12日晚上,CVTE笔试编程第一道题):
思路很简单:
(1)先将数组中的奇数和偶数分开(利用两个指针遍历一遍即可,同时统计好数组中奇数的个数);
(2)然后分别进行快速排序。
1 #include2 #include 3 #include 4 using namespace std; 5 void quick_sort(int *nums, int first, int last); 6 int partion(int *nums, int first, int last); 7 void sort(int *nums, int length) 8 { 9 int count1 = 0, count2 = 0;10 int *first = nums;11 int *last = nums + length - 1;12 while (first < last)13 {14 while (*first % 2 == 1)15 {16 count1++; first++;17 }18 while (*last % 2 == 0)19 {20 count2++; last--;21 }22 if (first < last)//这个条件判断很是关键,防止一开始就归类好的情况下(前面都是奇数,后面都是偶数),二者越界交换23 {24 int temp = *first; *first = *last; *last = temp;25 first++;26 last--;27 count1++;//二者交换完成后,也别忘记各自统计一次28 count2++;29 }30 }31 quick_sort(nums, 0, count1 - 1);32 quick_sort(nums, count1, length - 1);33 }34 void quick_sort(int *nums, int first, int last)35 {36 if (first >= last)return;37 int mid = partion(nums, first, last);38 quick_sort(nums, first, mid - 1);39 quick_sort(nums, mid + 1, last);40 }41 int partion(int *nums, int first, int last)42 {43 int ptvor = nums[first];44 while (first < last)45 {46 while (nums[last]>ptvor&&first < last)47 last--;48 nums[first] = nums[last];49 while (nums[first] <= ptvor && first < last) first++;50 nums[last] = nums[first];51 swap(nums[first], nums[last]);//????2016年3月22日再看到,莫名其妙的一句是不是52 }53 nums[last] = ptvor;54 return last;55 }56 57 int main()58 {59 int nums[10] = { 3, 6, 2, 10, 9, 22, 1, 8, 13, 15 };60 sort(nums, 10);61 for (int i = 0; i < 10; i++)62 cout << nums[i] << " ";63 return 0;64 }