冒泡排序法
冒泡排序是一种简单的排序方法,这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
它重复地走访过要排序的元素列,一次比较两个相邻的元素,如果他们的顺序有错误,就把他们的位置交换,走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说改元素已经排序完成。
算法原理
- 比较相邻的元素,如果第一个比第二个大,就交换他们的位置。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
核心代码
int[] arr = new int[] { 5, 4, 9, 1, 8, 3, 7, 2, 6, 0 }; //定义数组
int temp = 0;
for (int i = 0; i < arr.Length - 1; i++) //外层循环,总趟数
{
for (int j = 0; j < arr.Length - 1 - i; j++) //内层循环,每次比较的次数,越来越少的
{
if (arr[j] > arr[j + 1]) //交换位置
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在N个记录里,选取一个基准值Key,通常取第一个记录键值为基准值Key,还需要两个指针Low和High,数组第一个数为Low值,最后一个数为High值。Low和High分别与Key的值作比较,如果位置错误则交换位置,如果位置正确指针则往前走(如果一个指针和Key是一个值则另一个指针走,直到两个指针走到一起)。第一趟排序之后知道到Key的位置,如果从小到大,Key值左面都是小于Key值的数,右面都是大于Key的数。
以Key值为基准左右分成两个数组,分别在进行以上步骤。重新先去Key、Low、High的值。
第一趟排序的过程
起初数组 | 6 | 2 | 9 | 4 | 7 | 3 | Low为6,Key为6,High为3 |
---|---|---|---|---|---|---|---|
第一次交换 | 3 | 2 | 9 | 4 | 7 | 6 | Low为2,Key为6,High为6 |
第二次交换 | 3 | 2 | 9 | 4 | 7 | 6 | 位置正确,不做交换,Low为9,Key为6,High为6 |
第三次交换 | 3 | 2 | 6 | 4 | 7 | 9 | Low为6,Key为6,High为7 |
第四次交换 | 3 | 2 | 6 | 4 | 7 | 9 | 位置正确,不做交换,Low为6,Key为6,High为4 |
第五次交换 | 3 | 2 | 4 | 6 | 7 | 9 | Low为6,Key为6,High为6 |
第一次趟排序完成,找到Key 的为,左面都是小于它的数,右面都是大于它的数,然后从Key值分成两个数组,在做上面的步骤。
核心代码
public static int[] QuickSort(int[] nums, int low, int high)
{
if (low < high)
{
int temp = QuickPartition(nums, low, high);
QuickSort(nums, low, temp - 1); //对左边的数组进行排序
QuickSort(nums, temp + 1, high); //对右边的数组进行排序
}
return nums;
}
public static int QuickPartition(int[] nums, int low, int high)
{
int x = nums[low];
while (low < high)
{
//从High值往前去找小于等于Key 的数
while ((low < high) && (nums[high] >= x))
{
high--;
}
nums[low] = nums[high];
//从Low值往后去找大于等于Key的数
while ((low < high) && (nums[low] <= x))
{
low++;
}
nums[high] = nums[low];
}
nums[low] = x;
return low;
}
总结
冒泡排序很好理解,对于快速排序,我建议应该去纸上把每次交换的数字都写上,虽然这样很麻烦,但是这也是让我们更直观的看到他们是怎么走的! 感谢那些巨人们,我们要站在他们的肩膀上!
如有错误,还请各位大佬在评论区多多指正,非常感谢!!!