排序:氣泡排序&快速排序

一大口甜茶發表於2020-11-28

氣泡排序

1、基本思想:將第一個記錄的關鍵字與第二個記錄的關鍵字比較,若為逆序,則將兩個記錄交換,再向後比較。關鍵字小的漂浮,關鍵字大的下沉。
2、穩定性:演算法穩定。
3、時間複雜度:O(n²),空間複雜度:O(1)
4、程式碼實現:

#include<stdio.h>
#define N 5  /*陣列長度上限*/
int main()
{
	int A[N],i,j,temp;
	printf("請輸入五個數字:\n");
	for(i=0;i<N;i++)         /*給陣列賦值*/ 
		scanf("%d",& A[i]);
	for(i=1;i<N;i++)/*外層迴圈控制比較的輪數*/ 
		for(j=0;j<N-i;j++)/*內層迴圈控制每一輪比較的次數*/ 
			if(A[j]>A[j+1])/*前後兩組數比較交換*/ 
			{
				temp=A[j];
				A[j]=A[j+1];
				A[j+1]=temp;
				 
			} 
			printf("氣泡排序結果為:\n");
			for(i=0;i<N;i++)
				printf("%d\t",A[i]);
				return 0; 
 } 

快速排序

1、基本思想:①從數列中取一個數作為基準數(樞軸)。②比基準數大的放右邊,小於等於的放左邊。③重複第二步至各區間只有一個數,達到整個序列有序。
2、具體操作:假設樞軸關鍵字為pivotkey,附設兩個指標low和high,初值分別為s和t。將樞軸記錄移至臨時變數,若high≥pivotkey,則high減1(符合劃分割槽間,進一步縮小範圍),否則將high所指關鍵字移至low所指位置(將不符合的關鍵字移至正確區間)。當high所指不符合要求後檢測low所指記錄,若low≤pivotkey,則low增1,否則將low所指關鍵字移至high所指位置。重複進行兩個方向的檢測,直至high與low兩個指標指向同一位置重合為止。
3、樞軸元素的選取:通常選取第一個元素。可選:首元素、尾元素、中值元素(首元素、尾元素、中間位置元素三者中中間大小的那個元素)、隨機元素。
4、穩定性:不穩定
5、時間複雜度:O(n),平均時間複雜度O(n lb n)
6、程式碼實現:

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int array[MAX];
void FastSort(int n,int min,int max)//快速排序
{
 int i=0;
 int head,tail;
 int t;
  if(min<max)//從表的兩端交替地向中間掃描
 {
  head=min;
  tail=max;
  t=array[head];//記錄樞軸的位置
  while(head!=tail)
    {
   while(head<tail&&array[tail]>=t)//從右向左掃描
    tail--;
   if(head<tail)
    array[head++]=array[tail];//交換結點
   while(head<tail&&array[head]<=t)//從左到右掃描
    head++;
       if(head<tail)
    array[tail--]=array[head];
  }
  array[head]=t;
  FastSort(n,min,head-1);
  FastSort(n,tail+1,max);
 }
}
void main()
{
 int i,count=0;
 char flag;
 printf("請輸入要排序的數字\n");
 for(i=0;flag!='\n';i++)
 {
  scanf("%d",&array[i]);
  flag=getchar();
  count++;
 }
 FastSort(count,0,count-1);
 printf("快速排序結果為:\n");
 i=0;
 while(i<count)
 {printf("%d ",array[i]);
  i++;}
 printf("\n");
}


相關文章