排序算法之冒泡排序

回眸只為那壹抹淺笑 提交于 2020-03-04 11:38:12

排序算法之冒泡排序


分析思路:冒泡排序,顾名思义就是像冒气泡一样,可以从前冒到后,也可以从后冒到前。这里以从后冒到前,从小到大排序举例:从最后一个值开始,不断将其与前一个值进行比较,如果后面的值比前面的值要小,那就进行交换,这样遍历一次之后,序列第一个位置就已经是最小的值了,如此循环,O(n2)之后就可以全部排好序。

编程思路

  1. 顺序存储:如果序列为数组,我们可以采用两重for循环。第一重for循环用于记录未排好序序列的起点,第二重for循环用于遍历、比较和交换。

  2. 链式存储:如果序列为链表,我们可以采用双指针。第一个指针用于记录未排好序子链的起点,第二个指针用于遍历、比较和交换。(链式存储只能从前冒到后)

具体代码

  1. 顺序存储
void Emit_Bubble_Sort(int array[],int n)
{
	for (int i = 0; i < n; i++) {
		for (int j = n-1; j > 0; j--) {
			if (array[j] < array[j - 1]) {
				int temp = array[j];
				array[j] = array[j - 1];
				array[j - 1] = temp;
			}
		}
	}
}
  1. 链式存储
void Emit_Bubble_Sort(Node *Head)
{
    Node *p=Head->next,*q=Head->next->next,*pre_q=Head->next,*pre_pre_q=Head,*r;
    //p指针用于记录排好序的子链末尾,q指针用于遍历,pre_q指针用于记录q的前驱,pre_pre_q用于记录pre_q的前驱,r指针用于记录q指针的后继
    while(p != NULL)
    {
        while(q != NULL)
        {
            r=q->next;
            if(q->data < pre_q->data)//如果后面比前面小,则交换位置,并更新指针
            {
                pre_pre_q->next=q;
                q->next=pre_q;
                pre_q->next=r;
                pre_pre_q=q;
                q=r;
            }
            else//否则指针全部后移一位更新
            {
                pre_pre_q=pre_q;
                pre_q=q;
                q=q->next;
            }
        }
        //一次遍历完后,更新所有指针
        pre_pre_q=p;
        pre_q=p->next;
        q=pre_q->next;
        p=p->next;
    } 
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!