口试100题之21与特定元素交换的排序算法
面试100题之21与特定元素交换的排序算法
题目描述:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序( 必须采用交换实现)
思路分析:任何排序算法都可以,主要就是这里对交换的规则有了规定,只要设计出交换函数,所有的问题就可以迎刃而解了。
参考代码:
题目描述:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序( 必须采用交换实现)
思路分析:任何排序算法都可以,主要就是这里对交换的规则有了规定,只要设计出交换函数,所有的问题就可以迎刃而解了。
参考代码:
void SpecialSwap(int &a, int &b, int &mid)//特定的交换函数 { if(a == b) return; Swap(mid, a); Swap(a, b); Swap(mid, b); } //使用特定交换函数的快排 void QuickSort(int *arr, int nLen, int &mid) { if(nLen <= 0) { return; } assert(arr); int key = arr[nLen - 1]; int Begin = 0; for(int j = 0; j < nLen - 1; ++j) { if(arr[j] <= key) { SpecialSwap(arr[j], arr[Begin], mid); ++Begin; } } SpecialSwap(arr[Begin], arr[nLen - 1], mid); QuickSort(arr, Begin, mid); QuickSort(&arr[Begin + 1], nLen - Begin - 1, mid); }最后给出main函数及一些辅助函数
#include<stdio.h> #include<assert.h> inline void Swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; } void Print(int *arr, int nLen) { for(int i = 0; i < nLen; ++i) { printf("%d ", arr[i]); } printf("\n"); } int main() { const int Max_N = 100; int arr[Max_N]; int n,i; while(scanf("%d", &n) != EOF) { for(i = 0; i < n; ++i) { scanf("%d", &arr[i]); } //将数字0,归位到arr[0]的位置 for(i = 0; i < n; ++i) { if(arr[i] == 0) { Swap(arr[i], arr[0]); break; } } QuickSort(&arr[1], n - 1, arr[0]); Print(arr, n); } }