【直接插入法1】假第n个元素之前已经从排列好,那么从第n-1个元素开始往前循环,每个元素与第n个元素比较,如果比第n个元素大,那么这个元素后移一位,直到找到比第n个元素小的元素,因为这个元素之前的元素都比第n个元素小,所以不需要再比较了,这个元素换成第n个元素的值。这样前n个元素就排好了。
void InsertSort(int arr[], int len) { int i, j; int temp; for (i = 1; i < len; i++) { temp = arr[i]; for (j = i - 1; j >= 0 && arr[j] > temp;j--) arr[j + 1] = arr[j]; arr[j + 1] = temp; } }
【直接插入法2】和直接插入法1相似,只是从第n个元素开始往前循环,第n-1个和第n个比较,如果大就交换,再比较第n-2与第n-1个,一直循环到第0个与第1个,或者前一个比后一个小就退出。
void InsertSort(int arr[],int n){ for (int i=1;i<n;i++){ for(int j=i;j>0 && arr[j-1]>arr[j];j--){ int temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; } } }
插入排序的时间复杂度最好的情况是已经是正序的序列,只需比较(n-1)次,时间复杂度为O(n),最坏的情况是倒序的序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ) ,平均的话要比较时间复杂度为O(n^2 )
【冒泡法】遍历数组的前n-1项,
void BubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
第一个for循环是遍历所有元素,第二个for循环是每次遍历元素时都对无序区的相邻两个元素进行一次比较,若反序则交换,这样每一次遍历都把当前遍历的最大元素放到后面,后面部分是排序好的。当i=0时找到数组的最大元素,放到n-1的位置,第二次遍历找到第二大元素,放到n-2的位置。
时间复杂度最坏的情况是反序序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ),最好的情况是正序,只进行(n-1)次比较,不需要移动,时间复杂度为O(n),而平均的时间复杂度为O(n^2 )
【冒泡排序优化】当第2个循环没有发生交换的时候,说明都已经排序好了,这时不需要再循环了。
void BubbleSort(int arr[], int n) { int current; for (int i = 0; i < n - 1; i++){ for (int j = 0; j < n - i - 1; j++){ current = 0; if(arr[j] > arr[j + 1]){ int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; current = j; } } if (current == 0) break; } }
【快速排序】快速排序的思路是先找出一个轴值(用oncesort找,oncesort是把第一个数放到合适的位置,使它左边的数字都比它小,右边的数字都比它大,oncesort返回这个位置),然后把数组分成左边一部分和右边一部分,分别进行排序,一直递归下去。
int OnceSort(int arr[], int first, int end){ int i = first,j = end; while(i < j){ while(i < j && arr[i] <= arr[j]) j--;/ if(i < j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } while(i < j && arr[i] <= arr[j]) i++; if(i < j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } return i; } void QuickSort(int arr[], int first, int end){ if (first < end) { int pivot = OnceSort(arr,first,end); cout<<pivot<<endl; QuickSort(arr,first,pivot-1); QuickSort(arr,pivot+1,end); } }