插入排序,快速排序
//#include <stdio.h> // c 库 #include <stdlib.h> //maclloc 库 #include <iostream> // c++ 库 // 有本句 ,下面cout 前面可以没有 std:: using namespace std; typedef int ElemType; //元素数据类型 int void Traver(ElemType B[], int len) { cout << "\n------------\n"; for (int i = 1; i <= len; i++) { cout << B[i] << " "; } cout << "\n------------\n"; } void swap(ElemType& a, ElemType& b) { ElemType temp; temp = a; a = b; b = temp; } //插入排序 //i从1开始,至N-1(其后仅剩一个),拿着第i个和其后的每一个比, // 找到最小的元素位置,第i个和最小的交换后,第i个排列完成,因i从1是开始因此前面的都已排列完成。 void SelSort(ElemType B[], int N) { ElemType MinPos; int i, j; for (i = 1; i <= N; i++) { MinPos = i; for (j = i + 1; j <= N; j++) if (B[MinPos] > B[j]) MinPos = j; if (i != MinPos) swap(B[i], B[MinPos]); } } // 划分两部分,找枢纽位置,搬运数据 //划分成以 pivot 为枢纽的两部分,左大于枢纽,左小于枢纽 //low high 分别指待排序的元素起始下标和结束下标。 假设以B[low]值为枢纽,将B[low]搬运到枢纽 //当high指向元素满足大于枢纽时,移动high指针,直到B[high]小于枢纽,将值搬运到B[low] //当low指向元素满足小于枢纽时,移动low指针,直到B[low]大于枢纽,将值搬运到B[high] // 继续搬运,直到low==high //当high指向元素满足大于枢纽时,移动high指针,直到B[high]小于枢纽,将值搬运到B[low] //当low指向元素满足小于枢纽时,移动low指针,直到B[low]大于枢纽,将值搬运到B[high] //结束循环,将枢纽的值搬到枢纽应呆的地方 int Partition(ElemType B[], int low, int high) { ElemType pivot = B[low]; while (low < high) { while (low < high && B[high] >= pivot) --high; B[low] = B[high]; while (low < high && B[low] <= pivot) ++low; B[high] = B[low]; } B[low] = pivot; return low; }
//快速排序递归算法 //第一层执行时,(一般)换分为两大部分 //对左部分进行划分,对右部分进行划分。 然后先执行左划分进入第二层循环(第一层里循环的右划分未开始执行,左边全部递归完成),第二层仍然先执行其左划分 …………
//直到某一层的左边执行完,开始进行那一层的右(从本层povit+1起,high乃其上一层的枢纽位置-1),右可能又需要递归并左划分有划分。每层第右执行完,递归返回上一层。
void QuickSort(ElemType B[], int low, int high) { if (low < high) { int povit = Partition(B, low, high); QuickSort(B, low, povit - 1); QuickSort(B, povit + 1, high); } } //递归法求累加和 //归并、快速等排序使用了递归 ,再熟悉下递归 int Sum(int N) { int sum; if (N == 1) return 1; else sum = Sum(N - 1) + N; } void main() { int B[] = { 0,50,40,30,20,10,1,2 }; //Traver(B, 3); //选择排序 //SelSort(B, 7); //快速排序 QuickSort(B, 1, 7); Traver(B, 7); //计算前N项和 int N = 100; int sum = Sum(N); cout << endl << "Sum(" << N << ") = " << sum; }