面试100题之21与特定元素交换的排序算法
2013-09-13 21:23
309 查看
题目描述:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序( 必须采用交换实现)
思路分析:任何排序算法都可以,主要就是这里对交换的规则有了规定,只要设计出交换函数,所有的问题就可以迎刃而解了。
参考代码:
最后给出main函数及一些辅助函数
思路分析:任何排序算法都可以,主要就是这里对交换的规则有了规定,只要设计出交换函数,所有的问题就可以迎刃而解了。
参考代码:
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); } }
相关文章推荐
- 微软面试100题系列---交换元素使2个序列的差值最小
- 交换元素,使两数组之和的差最小 【微软面试100题 第三十二题】
- 交换元素,使两数组之和的差最小 【微软面试100题 第三十二题】
- 微软等数据结构+算法面试100题(21)--二叉树打印到叶子节点的所有路径
- 面试100题:21.中兴面试题:求整数数列中和等于给定值的两个数
- 在字符串中删除特定的字符 【微软面试100题 第六十三题】
- IT公司100题-32-交换元素,使数组差最小
- 在字符串中删除特定的字符 【微软面试100题 第六十三题】
- 面试100题:5.查找最小的k个元素
- 旋转数组中的最小元素 【微软面试100题 第六十九题】
- 查找最小的k个元素 【微软面试100题 第五题】
- 旋转数组中的最小元素 【微软面试100题 第六十九题】
- 【LeetCode91-100】编码种数,逆转单链表,IP地址转化,中序遍历二叉树,生成二叉搜索树,计算二叉树个数,交叉string【hard】,判断二叉搜索树是否合法,恢复二叉树(有两个元素被交换)
- 笔试、面试100题(21---40)
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 面试 (一) : iOS基础篇-3(100题21~40)
- (微软面试100题)查找最小的K个元素
- 面试100题:21.中兴面试题:求整数数列中和等于给定值的两个数
- 面试100题:5.查找最小的k个元素
- 交换单链表中的特定元素