// 冒泡排序:每一轮确定一个[1, i]区间内的最大值,该最大值最后放置的位置为i,n-1次循环后整个数组就有序了voidBubbleSort(int a[],int n){for(int i =0; i < n -1; i ++)for(int j =0; j < n - i -1; j ++)if(a[j]> a[j +1])swap(a[j], a[j +1]);}
2.改进冒泡排序
// 改进冒泡排序:每一次循环记录当前轮次下进行交换的次数,当交换次数为0时说明数组不存在逆序对,则数组有序voidImprovedBubbleSort(int a[],int n){int swapTimes =0;int len = n;do{
swapTimes =0;
len --;for(int i =0; i < len; i ++)if(a[i]> a[i +1]){swap(a[i], a[i +1]);
swapTimes ++;}}while(swapTimes);}
3.选择排序
// 选择排序voidSelectionSort(int a[],int n){for(int i =0; i < n -1; i ++)for(int j = i +1; j < n; j ++)if(a[i]> a[j])swap(a[i], a[j]);}
4.插入排序
// 插入排序:依次从有序的部分数组末尾向前寻找当前元素的插入位置voidInsertionSort(int a[],int n){for(int i =1; i < n; i ++){int j = i -1;int tmp = a[i];// 保存需要插入的元素while(j >=0&& a[j]> tmp) a[j +1]= a[j], j --;
a[j +1]= tmp;}}
5.快速排序
// 快速排序:这里我们采用中间元素来进行划分voidQuickSort(int a[],int l,int r){if(l >= r)return;int x = a[l + r >>1], i = l -1, j = r +1;while(i < j){do i ++;while(a[i]< x);do j --;while(a[j]> x);if(i < j)swap(a[i], a[j]);}QuickSort(a, l, j);QuickSort(a, j +1, r);}
6.归并排序
// 归并排序voidMergeSort(int a[],int l,int r){if(l >= r)return;int mid = l + r >>1;MergeSort(a, l, mid);MergeSort(a, mid +1, r);// 当前得到了[l,mid]和[mid+1,r]两个有序的数组,现在要做的事情时将两个数组进行合并int tmp[r - l +1];// 临时数组,暂存元素int k =0, i = l, j = mid +1;while(i <= mid && j <= r)if(a[i]< a[j]) tmp[k ++]= a[i ++];else tmp[k ++]= a[j ++];while(i <= mid) tmp[k ++]= a[i ++];while(j <= r) tmp[k ++]= a[j ++];for(int i = l, j =0; i <= r; i ++, j ++) a[i]= tmp[j];}