写代码前,将这些算法分步骤建立模型,代码就好写了
1、冒泡排序
冒泡排序是非常容易理解和实现,以从小到大排序举例:
设数组长度为N。
- 比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
- 这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
- N=N-1,如果N不为0就重复前面二步,否则排序完成。
void _swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void BubbleSort(int a[],int n) { assert(a != NULL); assert(n > 0); int i, j; int flag = 0; for(i = 0; i < n-1; i++) { for(j = 0; j < n-i-1; j++) { if(a[j+1] < a[j]) { _swap(a+j+1, a+j); flag = 1; } } if(flag == 0) break; } }
冒泡排序基本就是,两两相邻的比较,满足条件交换,经过一轮使得最大的数沉到最后,循环n-1轮,排序完成。
2、选择排序
设数组为a[0…n-1]。
- 初始时,数组全为无序区为a[0..n-1]。令i=0
- 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。
- i++并重复第二步直到i==n-1。排序完成。
1 void SelectSort(int a[], int n) 2 { 3 assert(a != NULL); 4 assert(n > 0); 5 6 int i, j; 7 for(i = 0; i < n-1; i++) 8 { 9 int nMinIndex = i; 10 for(j = i; j < n-1; j++) 11 { 12 if(a[j+1] < a[nMinIndex] ) 13 { 14 nMinIndex = j+1; 15 } 16 } 17 if(i != nMinIndex) 18 { 19 _swap(a+i, a+nMinIndex); 20 } 21 } 22 }
选择排序就是将待排序的元素分为无序区和有序区,从无序区选取最小的元素插入有序区的最后,循环n-1轮,排序完成。
3、插入排序
插入排序和选择排序类似,都将数据分为有序区和无序区,所不同的是插入排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。
设数组为a[0…n-1]。
- 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1
- 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。
- i++并重复第二步直到i==n-1。排序完成。
1 void InsertSort(int a[], int n) 2 { 3 assert(a != NULL); 4 assert(n > 0); 5 6 int i,j; 7 8 for(i = 1; i < n; i++) 9 { 10 11 for(j = 0; j < i; j++) 12 { 13 if(a[i] < a[j]) 14 { 15 break; 16 } 17 } 18 int insertIndex = j; 19 int tmp = a[i]; 20 for(j = i-1; j >= insertIndex; j--) 21 { 22 a[j+1] = a[j]; 23 } 24 a[insertIndex] = tmp; 25 } 26 }
选择排序就是将待排序的元素分为无序区和有序区,将无序区第一个元素插入到有序区中,循环n-2轮,排序完成。
时间: 2024-10-09 10:04:38