排序总结
快速排序基本思路:
基本思想:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
首先从后往前寻找比基准元素小的值 移动
然后从前往后寻找比基准元素大的值 移动
循环 直到i==j
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
快速排序图解
void quickSort(int a[],int low,int high) {int i, j, pivot;if (low < high) {pivot = a[low];i = low;j = high;while (i < j) {while (i < j && a[j] >= pivot) //从右往左找一个小于基准值数j--;if (i < j)a[i++] = a[j];while (i < j && a[i] <= pivot) //从左往右找一个大于基准值的数i++;if (i < j)a[j--] = a[i];}a[i] = pivot;quickSort(a, low, i - 1);quickSort(a, i + 1, high);}
}
排序的全过程:
2、归并排序图解
//合并算法
void merge(int arr[], int start, int end, int mid, int *temp) {int i_start = start;int i_end = mid;int j_start = mid + 1;int j_end = end;int length = 0; //表示辅助空间有多少个元素while (i_start <= i_end && j_start <= j_end) {if (arr[i_start] < arr[j_start])temp[length++] = arr[i_start++];elsetemp[length++] = arr[j_start++];}while (i_start <= i_end)temp[length++] = arr[i_start++];while (j_start <= j_end) //必须加等于temp[length++] = arr[j_start++];for (int i = 0; i < length; i++)将排好序的存回arr中start到end这区间{arr[start + i] = temp[i];}
}
void mergeSort(int arr[], int start, int end, int *temp) {if (start >= end)return;int mid = (start + end) / 2;mergeSort(arr, start, mid, temp);mergeSort(arr, mid + 1, end, temp);//合并merge(arr, start, end, mid, temp);
}
void testMergeSort() {int arr[] = { 3,5,9,6,1,8,0,4,2 };int length = sizeof(arr) / sizeof(int);int* temp = (int *)malloc(sizeof(int)*length);mergeSort(arr, 0, length - 1, temp);printArray(arr,length);
}
3、插入排序图解
void insertSort() {int a[] = { 3,5,9,6,1,8,0,4,2 };int length = sizeof(a) / sizeof(a[0]);int j;for (int i = 1; i <length; i++){int temp = a[i];for (j = i - 1; j >= 0 && temp<a[j]; j--){a[j + 1] = a[j];}a[j + 1] = temp;}printArray(a, length);
}
4、希尔排序图解
void shellSort2() { //面试书int a[] = { 3,5,9,6,1,8,0,4,2 };int length = sizeof(a) / sizeof(a[0]);int h ,i,j;for (h=length/2; h>0; h=h/2){for (i = h; i < length; i++){int temp = a[i];for (j = i-h; j >=0 && temp<a[j]; j-=h){a[j + h] = a[j];}a[j + h] = temp;}}printArray(a, length);
}
参考自https://blog.csdn.net/aabbcc132/article/details/88540291