快速排序,选择排序,冒泡排序
三种排序算法是在数组排序中用到比较多的,下面来具体说明各种排序方法以及区别
快速排序法
使用快速排序方法对a[n]排序
从a[n]中选择一个元素作为基准,一般选a[0],设定low指向a[0](队首),high指向a[n-1](队尾),
先从队尾开始向前扫描,若a[high]>a[0],则high--,否则将a[high]赋值给a[low],即a[low]=a[high]
然后从队首开始向前扫描,若a[low]<a[0],则low++,否则a[high]=a[low]
这样,会将所有小于基准数a[0]的元素放到a[0]左边,把大于a[0]的元素都放到a[0]右边
再使用递归分别对左边、右边的子数组进行排序,最终完成排序
1 //快速排序算法(快速排序可参考:https://blog.csdn.net/nrsc272420199/article/details/82587933)
1 void Quick_Sort(int arr[], int begin, int end){ 2 //tmp是作为比较的基数 3 if(begin > end) return; 4 int tmp = arr[begin]; 5 int i = begin; 6 int j = end; 7 while(i != j){ 8 // 当队尾的元素大于等于基准数据时,向前挪动j索引 9 while(i < j && arr[j] >= tmp){ 10 j--; 11 } 12 // 当队首的元素大于等于基准数据时,向后挪动i索引 13 while(i < j && arr[i] <= tmp){ 14 i++; 15 } 16 //此时是arr[i] > tmp, arr[j] < tmp,交换arr[i]和arr[j] 17 if(i < j){ 18 int t = arr[i]; 19 arr[i] = arr[j]; 20 arr[j] = t; 21 } 22 } 23 //当一轮循环过后,i = j , 此时的i和j就是tmp的正确索引位置 24 arr[begin] = arr[i]; 25 arr[i] = tmp; // 交换基数到正确索引位置 26 27 // 递归调用,按照上述方法流程继续对index位置两端的子数组进行排序 28 Quick_Sort(arr, begin, i-1); 29 Quick_Sort(arr, i+1, end); 30 }
32 //冒泡排序,小到大。(如果是从大到小,就要对数组从后往前进行冒泡遍历) 33 @Test 34 public void bubbleSort(){ 35 Scanner sc = new Scanner(System.in); 36 int temp, arr[]; 37 while(sc.hasNext()){//可循环进行测试 38 //输入数组长度和数组,比如:输入5回车后,再输入 1 3 4 2 6 39 int n = sc.nextInt(); 40 arr = new int[n]; 41 for(int i =0;i<n;i++){ 42 arr[i] = sc.nextInt(); 43 } 44 //数组中相临两数比较,前面的大于后者就交换位置 45 //冒泡排序:每一轮将依次出现一个最大数(最右边),次大数... 46 for(int i=0;i<n-1;i++){ 47 for(int j=0;j<n-1-i;j++){ 48 if(arr[j] > arr[j+1]){ 49 temp = arr[j]; 50 arr[j] = arr[j+1]; 51 arr[j+1] = temp; 52 } 53 } 54 } 55 //排序后 56 for(int i=0;i<n;i++){ 57 System.out.print(arr[i]+" "); 58 } 59 } 60 } 61 62 //选择排序,小到大 63 @Test 64 public void selectSort(){ 65 Scanner sc = new Scanner(System.in); 66 int temp, arr[]; 67 while(sc.hasNext()){//可循环进行测试 68 int n = sc.nextInt(); 69 arr = new int[n]; 70 for(int i =0;i<n;i++){ 71 arr[i] = sc.nextInt(); 72 } 73 //数组中每个数依次与它后面的数进行比较,若前者大于后者,交换二者位置 74 for(int i=0;i<n-1;i++){ 75 for(int j=i+1;j<n;j++){ 76 if(arr[i]>arr[j]){ 77 temp = arr[i]; 78 arr[i] = arr[j]; 79 arr[j] = temp; 80 } 81 } 82 } 83 //排序后 84 for(int i=0;i<n;i++){ 85 System.out.print(arr[i]+" "); 86 } 87 } 88 }
另外,冒泡排序和选择排序相似,时间复杂度也相同。
下面是各种排序算法的复杂度比较:
以上就是三种排序法的介绍,如有不足还请指出。