void Bubble_sort(int *a, int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1; j++) { if (a[j] > a[j + 1]) { int tmp = a[j]; a[j] = a[j + 1]; a[j + 1] = tmp; } } } } void Selection_sort(int *a, int n) { for (int i = 0; i < n - 1; i++) { int k = i; for (int j = i + 1; j < n; j++) { if (a[j] < a[k]) { k = j; } } int tmp = a[i]; a[i] = a[k]; a[k] = tmp; } } void Insertion_sort(int *arr, int n) { int tmp; int j; for (int i = 0; i < n; i++) { tmp = arr[i]; for (j = i; j > 0 && arr[j - 1] > tmp; j--) { arr[j] = arr[j - 1]; } arr[j] = tmp; } } void quick_sort(int *arr, int begin, int last) { int left = begin; int right = last; if (begin < last) { int pivot = arr[left]; while (left < right) { while (left < right && arr[right] >= pivot) { right--; } if (left < right) { arr[left] = arr[right]; } while (left < right && arr[left] <= pivot) { left++; } if (left < right) { arr[right] = arr[left]; } } arr[left] = pivot; //递归-----这个时候当前数组的枢轴数已经被放到这个数组的中间了,以枢轴为基准,划分出另外两个数组 quick_sort(arr, begin, left - 1); //处理枢轴左边数组 quick_sort(arr, left + 1, last); //处理枢轴右边数组 } }
冒泡排序的内层循环用来比较,如果a[j]大于a[j+1] 则将这两个元素位置互换, 外层循环则是用来排序,确保所有元素都以合适的位置存放,而不是只进行一次排序(也就是只进行了一次内层循环)
选择排序则是将a[i]预设为剩下未排序元素中最小,随后对未排序元素进行遍历【之前排序的元素已经按顺序排好】,当遇到小于a[i]的数时,将smallest置为j【未排序元素中最小元素的位置】,之后将a[i]和a[j]的元素互换。
插入排序则是将一个未排序元素插入到有序元素组中。 内部循环找到tmp合适的位置(也就是当a[j-1]<tmp时的位置)。而将大于tmp的a[j-1]则排到后面去。【因为它们大于tmp】 外层循环确保排序正常。
快速排序则是利用递归和左右依次扫描实现,属于分而治之思想。它先找到一个pivot——枢轴值,通常是a[begin], 之后进行循环,首先循环右边,当右边的元素都大于枢轴值并且右边的索引大于左边的索引时,每次右边索引--; 直到遇到左边索引或者遇到一个小于枢轴值且在右侧的值; 这时将它移到枢轴的左边(a[left]=a[right]) 之后进行左边,左边的思路就是反其道而行之。
最后当left索引==right索引时,就跳出循环,因为已经到了这个数组的中央了,这个位置放置枢轴值。 之后以这个位置 分割出两个新的数组。用递归给这两个数组进行新的快排,直到所有元素的顺序都排对了。
排序算法——选择排序、冒泡排序、插入排序、快速排序(C语言)
原文:https://www.cnblogs.com/yurizero/p/14407206.html