**
** (遍历N-1次,每次找出数组的最小值与前面的数交换实现有序)
void SelectSort(int *a,int n) { // if 与for的结合 int temp; for (int i = 0; i <n-1; i++)//每次选出第i小,最后一位不用选,已经是了 { int k = i;//k作为最小值下标保存 for (int j = i + 1; j < n; j++)//找出每次遍历的最小值 { if (a[k] > a[j])// k和j比较,找出最小值 { k = j;//保证k保存的是此次遍历的最小值 } } if(k!=i) { Swap(&a[k],&a[i]) } } } }ps:在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。
**
** (逐步构造出有序,找到造成不有序的值,和前面的值比较,若小于前面的值后移空出位来,直至大于前面的数插入)
void insert_sort(int *a,int n) { int tmp; int j; for (int i = 1; i < n; i++)//1 有序 { if (a[i] < a[i - 1]) { tmp = a[i];//还要比较前面的数是否小于它,保存插入数 j = i - 1; do//前面判断过i与i-1 { a[j+1] = a[j ];//将大于它的值后移,空出位子来让它插入 j--; } while (j>=0&&a[j]>tmp); a[j+1] = tmp;//此时插入j的位置使得有序 } } }void Bubble_sort() { bool tag = true; for(int i=0;i<n-1;i++) //只有最后一位不用比较 {
for (int j = 0; j < n-1-i; j++)//每次将最大的值放在最后 { if (a[j] > a[j + 1])//两两比较 { Swap(&a[j],&a[j + 1]); tag = false;//是否有序 } } //已经有序不用交换了 if (tag) { break; } }}