#include "stdafx.h" void BubbleSort(int *a, int N) { //冒泡排序实现的两种方式 /* 思想: 执行n-1趟排序,把每一趟排序的最小值放在a[i]处 for(int i=0; i<N-1; ++i) { for(int j=i+1; j<N; ++j) { if(a[i]>a[j]) { int nTemp = a[i]; a[i] = a[j]; a[j]=nTemp; } } } //*/ // 思想: 执行n-1趟排序,从最后一个元素逐个往前相邻数据进行比较,一旦发现后一个比 // 相邻前一个大,就交换,直到到达待排序的位置 i 处,i 处得到的就是一趟比较 // 后的最小值。 for(int i=0; i<N-1; ++i) { for(int j=N-1; j>i; --j) { if(a[j]<a[j-1]) { int nTemp = a[j]; a[j] = a[j-1]; a[j-1]=nTemp; } } } } void ChoiceSort(int *a, int N) { int nIndex = 0; for(int i=0; i<N-1; ++i) { nIndex = i; for(int j=i+1; j<N; ++j) { if(a[nIndex]>a[j]) { nIndex = j; } } if (i != nIndex) { int nTemp = a[i]; a[i] = a[nIndex]; a[nIndex]=nTemp; } } } int Part(int *a, int low, int high) { int key = a[low]; while(low<high) { while((low<high) && (a[high]>=key)) { high--; } if(low<high) { a[low++] = a[high]; } while((low<high) && (a[low]<=key)) { low++; } if(low<high) { a[high--]=a[low]; } }//end while a[low] = key; // low 和 high 相等 return low; } /* 思想:有三个指针,一个指向排序数组的下标 i,一个指向排序数组的上标 j,另一个指针表示key,初始值将其设置为数组的下标。 假设大于key的值在左边,小于key的值在右边。 一趟排序算法: 首先暂存key的值, 从左边开始依次查找直到找到小于key的值,然后将其放置在 i 位置(也就是i所值的位置), 从右边开始依次查找直到找到大于key的值,然后将其放置在 j 位置, 直到i=j,再将暂存的值放在该位置,最后返回该位置,作为下一次快速排序的基准位置。 //*/ void QuickSort(int *a, int low, int high) { int pivotpos; if(low<high) { pivotpos = Part(a, low, high); QuickSort(a, low, pivotpos-1); QuickSort(a, pivotpos+1, high); } } int main(int argc, char* argv[]) { int a[5] = {10, 8, 2, 5, 3}; // BubbleSort(a, 5); // ChoiceSort(a, 5); QuickSort(a, 0, 4); for(int i=0; i<5; ++i) { printf("%d/t", a[i]); } printf("/n"); return 0; }