「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
冒泡排序
冒泡原理
冒泡排序相信是很多人入门必学算法,是打开我们走向算法大门的钥匙,这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
原理:比较两个相邻的元素,将值大的元素交换到右边 直观表达:每一趟遍历,将一个最大的数移到序列末尾
算法实现
1、算法描述
比较相邻的元素,如果前一个比后一个大,交换之。 第一趟排序第1个和第2个一对,比较与交换,随后第2个和第3个一对比较交换,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。 第二趟将第二大的数移动至倒数第二位 ......
2、图示 3、算法空间复杂度和时间复杂度
空间复杂度:
- 最坏:o( )
- 最好:o( )
- 平均:o( )
时间复杂度(辅助存储):o(1)
稳定性:稳定
例题
-》用冒泡排序将以下数列按照从小到大的顺序输出:
123,45,6,22,99,1,38,41,-6,0
java代码:
public class Test {
public static void main(String[] args) {
int[] arr=new int[]{123,45,6,22,99,1,38,41,-6,0};
//冒泡排序 比较相邻的元素,如果第一个比第二个大,就交换他们两个
//需进行length-1次冒泡
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])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
System.out.println("从小到大排序后的结果是:");
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]+"\t");
}
}
复制代码
快速排序
快排原理
同样的,必学算法之一。快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法实现
1、算法描述 快速排序,说白了就是给基准数据找其正确索引位置的过程.
- 从数列中挑出一个元素,称为 "基准"(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
2、图示 3、算法空间复杂度和时间复杂度
空间复杂度:
- 最坏:o( )
- 最好:o( )
- 平均:o( )
时间复杂度(辅助存储):o( )
稳定性:不稳定
例题
用快速排序将以下数列按照从小到大的顺序输出:
-》66,13,51,76,81,26,57,69,23
java代码:
public class Test {
static void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
//交换
if (i < j) {
q[i] = q[i] ^ q[j];
q[j] = q[i] ^ q[j];
q[i] = q[i] ^ q[j];
}
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
public static void main(String[] args) {
int[] arr=new int[]{66,13,51,76,81,26,57,69,23};
//快速排序 分治
quick_sort(arr, 0, arr.length - 1);
System.out.println("快速排序后的结果是:");
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]+"\t");
}
}
复制代码