插入排序
插入排序的思想比较容易理解:使用相应变量将数组分成有序区和无序区,每次取出无序区中的第一个元素,插入到有序区的相应位置即可,随着有序区的长度逐渐增加,无序区长度逐渐减小,最后整个数组成有序状态。
#include<stdio.h> int main() { int a[] = {9,6,3,8,5,2,7,4,1} ; for(int i = 1 ; i < 9 ; i++) if(a[i] < a[i-1]) { // 判断无序区的第一个元素和有序区的最后一个元素的大小 int temp = a[i] ; // 需要将 temp 插入到有序区的合适位置中 int j = i - 1 ; for(; j >= 0 && a[j] > temp ; j--) // 有序区中大于 temp 的元素都需要右移一位 a[j+1] = a[j] ; a[j+1] = temp ; // temp 放到合适的位置中 } for(int i = 0 ; i < 9 ; i++) printf("%d ",a[i]) ; printf("\n") ; return 0 ; }
将数组中大于 temp 的元素右移过程中,可以使用相邻元素交换位置的方法实现元素右移:
#include<stdio.h> void Swap(int &a , int &b) { a = a ^ b ; b = a ^ b ; a = a ^ b ; } int main() { int a[] = {9,6,3,8,5,2,7,4,1} ; for(int i = 1 ; i < 9 ; i++) if(a[i] < a[i-1]) { // 判断无序区的第一个元素和有序区的最后一个元素的大小 for(int j = i ; a[j-1] > a[j] ; j--) // 相邻的两个元素比较大小 Swap(a[j],a[j-1]) ; // 如果相邻的两个元素,前面的大于后面的,交换两个元素的位置 } for(int i = 0 ; i < 9 ; i++) printf("%d ",a[i]) ; printf("\n") ; return 0 ; }