//冒泡排序算法 voidbubbleSort(int data[], int n) { //打印原始数据信息 cout << "\n 待排序数据为:"; for (int i = 0; i < n; i++) cout << data[i] << " "; //算法计时 LARGE_INTEGER nFreq, t1, t2; double dt; QueryPerformanceFrequency(&nFreq); QueryPerformanceCounter(&t1);
//排序算法 int count = 0; for (int i = 0; i < n - 1; i++) { bool flag = true;//排序提前完成标志 for (int j = 0; j < n - i - 1; j++) { if (data[j] > data[j + 1])//改成'<'则为降序 { swap(data[j], data[j + 1]); count++; flag = false; } } if (flag) break; }
//n-1次外循环,每次选出最大的放在最右边 //内循环与最大值比较,记录最大值的标签 voidselectSort(int data[], int n) { //打印原始数据信息(代码略,同上) //算法计时(代码略)
//排序算法 //int count = 0; for (int i = n - 1; i > 0; i--) { int max = i; for (int j = i - 1; j >= 0; j--)//从后向前推,有点绕 { if (data[j] > data[max])//改成'<'则为降序 max = j; } swap(data[max], data[i]); //count++; }
//轴点构造算法 intpartition(int x[], int lo, int hi) { swap(x[lo], x[lo + rand() % (hi - lo + 1)]);//任选一个元素与首元素交换 int pivot = x[lo];//以首元素为候选轴点————经以上交换,等效于随机选取 while (lo < hi)//从向量两端交替向中间扫描 { while ((lo < hi) && (pivot <= x[hi])) hi--;//不小于pivot下,向左拓展右端子向量 x[lo] = x[hi];//小于pivot者归入左侧序列 while ((lo < hi) && (x[lo] <= pivot)) lo++;//不大于pivot下,向右拓展左端子向量 x[hi] = x[lo];//大于pivot者归入右侧序列 }//assert:lo==hi x[lo] = pivot;//将备份的轴点记录置于前后子向量之间 return lo;//返回轴点的秩 }
//整体快速算法 voidquicksort(int x[], int lo, int hi) { if (hi - lo < 2) return;//单元素区间自然有序 int mi = partition(x, lo, hi - 1);//在[lo,hi-1]内构造轴点 quicksort(x, lo, mi);//对前缀递归排序 quicksort(x, mi + 1, hi);//对后缀递归排序 }