总结:排序算法中最基本的三种算法(简单选择,冒泡,插入),这三种排序算法的时间复杂度均为O(n2)
冒泡算法
冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。
时间复杂度为O(n2)
void bubbleSort(int arr[],int n){//冒泡排序
int flag=true;
for(int i=0;i<n-1;i++){
flag=false;
for(int j=n-1;j>=i;j--){//i+j=n-1
if(arr[j]<arr[j-1]){
swap(arr,j,j-1);
flag=true;
}
}
if(flag==false)
break;////设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已然完成。
}
}
简单选择算法
在算法实现时,每一趟确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小元素之前,这些交换都是无意义的。我们可以通过设置一个变量min,每一次比较仅存储较小元素的数组下标,当轮循环结束之后,那这个变量存储的就是当前最小元素的下标,此时再执行交换操作即可。比较多次,但是每一轮最后只交换一次。
时间复杂度为O(n2)
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;//每一趟循环比较时,min用于存放较小元素的数组下标,这样当前批次比较完毕最终存放的就是此趟内最小的元素的下标,避免每次遇到较小元素都要进行交换。
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
//进行交换,如果min发生变化,则进行交换
if (min != i) {
swap(arr,min,i);
}
}
}
直接插入算法
直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
#include <iostream>
void swap(int *&arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void InsertSort(int *arr,int n){//直接插入排序
int i,j;
for(i=1;i<n;i++){//跟摸牌一样,摸到一张就和抓到手的牌比较,然后整理
j=i;
while(j>0&&arr[j]<arr[j-1]){//摸到的第一张和第0张比大小,排好序
swap(arr,j,j-1);//摸到第2张和第1张比大小,第1张和第0张比
j--;//摸到第3张和第2张比大小,第2张和第1张比大小,第1张和第0张比大小
}
}
}
void print(int *arr,int n){
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
}
int main(int argc, char** argv) {
int arr[]={12,4,56,8,10,9,41};
InsertSort(arr,7);
print(arr,7);
return 0;
}
重点参考:
1、图解排序算法(一)之3种简单排序(选择,冒泡,直接插入)
2、https://blog.csdn.net/chaoyangsun/article/details/79972811
3、https://blog.csdn.net/qq_37597859/article/details/80584343