赞
踩
相邻两两比较
,较大的下沉,较小的上升,第一轮之后最小的数就被放到了第一个位置,以此类推。
若某一次完了之后已经排好序,则没必要进行到len-1次,可用一个flag,没有交换之后就没必要再进行下去了 。
#include <stdio.h> #include <stdlib.h> void bubbleSort(int a[],int length) { int len = length; int temp;//中间变量 bool flag;//优化标志,判断是否有交换 for(int i=0;i<len;i++) { flag = false; for(int j=len-1; j>i; j--) { if(a[j]<a[j-1]) { temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; flag=true; } } if(!flag)break; } } int main(void) { int A[] = {6,5,3,1,8,7,2,4,9}; int lengthA=9; printf("原始数组:\n"); for(int i=0;i<lengthA;i++) { printf("%d",A[i]); } printf("\n\n"); bubbleSort(A,lengthA); //冒泡排序 //selectionSort(A,lengthA); //选择排序 //insertSort(A,lengthA); //插入排序 //shellSort(A,lengthA); //希尔排序 //mergeSort1(A,0,lengthA-1,(int*)malloc(sizeof(int)*lengthA)); //归并排序(递归) //mergeSort2(A,lengthA); //归并排序(非递归) //heapSort(A,lengthA); //堆排序 //quickSort1(A,0,lengthA-1); //快排序方法一 //quickSort2(A,lengthA); //快排方法二 printf("排序结果:\n"); for(int i=0;i<lengthA;i++) { printf("%d",A[i]); } printf("\n\n"); return 0; }
一开始就从原始序列中找到最小
的元素,放到序列的起始位置作为已排序序列,然后在剩下的未排序的元素中继续寻找最小的元素,放到已排序的序列末尾
,以此类推,直到所有的元素排列完毕。
void selectionSort(int a[],int length) { int len = length; int minIndex; int temp; for(int i=0;i<len;i++) { minIndex=i; for(int j=i+1; j<len; j++) { if(a[j]<a[minIndex]) { minIndex = j; } } if(minIndex != i) { temp = a[i]; a[i] = a[minIndex]; a[minIndex] = temp; } } }
在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 插入排序在实现上,常采用in-place排序,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位
,为最新元素提供插入空间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。