1、选择排序
重复的循环,每次选出最小的数。
for(int i=0; i<v.size()-1; i++){ int min = v[i]; int temp; int index = i; for(int j=i+1;j<v.size();j++){ if(v[j] < min){ min = v[j]; index = j; } } temp = v[i]; v[i] = v[index]; v[index]= temp; }
2、冒泡排序
冒泡排序是对选择排序的一种改进,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
#include <stdio.h> void bubble_sort(int a[], int n) { int i, j, temp; for (j = 0; j < n - 1; j++) for (i = 0; i < n - 1 - j; i++) { if(a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } } }
3、快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
1.
j先开始向左移动,当遇到比key(初始值为数组的第一个值6)小的数5停下来,将此时的5赋值给数组第一个数,此时的数组变成5 1 2 7 9 3 4 5 10 8。key值不变为6.
2.
然后i从左侧开始移动寻找比key值大的数,遇到7时停止。此时将7赋值给j所在的位置,此时数组变成5 1 2 7 9 3 4 7 10 8。接着把key值赋值给此时7所在的位置。这样数组的值现在变为5 1 2 6 9 3 4 7 10 8。
3.
接着数组被分割成两部分,以key为界限,分别递归调用即可。
代码如下:
#include <iostream> using namespace std; void Qsort(int a[], int low, int high) { if(low >= high) { return; } int first = low; int last = high; int key = a[first];/*用字表的第一个记录作为枢轴*/ while(first < last) { while(first < last && a[last] >= key) { --last; } a[first] = a[last];/*将比第一个小的移到低端*/ while(first < last && a[first] <= key) { ++first; } a[last] = a[first]; /*将比第一个大的移到高端*/ } a[first] = key;/*枢轴记录到位*/ Qsort(a, low, first-1); Qsort(a, first+1, high); } int main() { int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24}; Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/ for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { cout << a[i] << ""; } return 0;